本文主要是介绍Thread守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
设置守护线程判断每位员工是否可以下班,要求员工时间大于或等于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;}@SneakyThrowspublic 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);//守护线程}@SneakyThrowspublic 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();}
}
这篇关于Thread守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!