Thread守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班

本文主要是介绍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小时才能够下班的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/815465

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法