设置守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班
package com.tw.thread;
import lombok.SneakyThrows;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;
/**
* @title: Woker
* @projectName: learn
* @description: 上下班时间
*/
public class Worker extends Thread {
//上班打卡时间
private Date beginTime;
//下班时间
private Date endTime;
//下班状态
private boolean isStop;
public Worker(Date beginTime) {
this.beginTime = beginTime;
}
@SneakyThrows
public void run() {
final Thread self = Thread.currentThread();
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
final String bStr = sdf.format(beginTime);
System.out.println(self.getId() + "员工卡号" + bStr + "打卡上班");
final Calendar cal = Calendar.getInstance();
cal.setTime(beginTime);
final Random random = new Random();
while (true) {
TimeUnit.SECONDS.sleep(3);
if (isStop) {
final String eStr = sdf.format(endTime);
System.out.println(self.getId() + "员工" + eStr + "下班............");
} else {
final int hour = random.nextInt(5);
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + hour);
endTime = cal.getTime();
}
}
}
public boolean getStop() {
return isStop;
}
public void setStop(boolean stop) {
isStop = stop;
}
public Date getEndTime() {
return endTime;
}
public double getWorkerLongTime() {
return (endTime.getTime() - beginTime.getTime()) / (1000 * 60 * 60);
}
}
package com.tw.thread;
import lombok.SneakyThrows;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @title: Sweeper
* @projectName: learn
* @description: 守护线程、定时监督
*/
public class Sweeper extends Thread{
private List<Worker> workers = new ArrayList<>();
private Sweeper(){
this.setDaemon(true);//守护线程
}
@SneakyThrows
public void run(){
while (true){
for (int i = 0; i < workers.size(); i++) {
Worker worker = workers.get(i);
if(worker.getEndTime()!=null && worker.getStop()){
final double longTime = worker.getWorkerLongTime();
if(longTime>=0){
worker.setStop(true);
System.out.println(worker.getId()+"员工超过八个小时,可以下班了!");
}else {
System.out.println(worker.getId()+"员工不足八个小时,不能下班");
}
TimeUnit.SECONDS.sleep(1);
}
}
}
}
public void addWorker(Worker worker){
this.workers.add(worker);
}
public static void main(String[] args) {
final Sweeper sweeper = new Sweeper();
sweeper.start();
final Worker w1 = new Worker(new Date());
sweeper.addWorker(w1);
final Worker w2 = new Worker(new Date());
sweeper.addWorker(w2);
final Worker w3 = new Worker(new Date());
sweeper.addWorker(w3);
w1.start();
w2.start();
w3.start();
}
}