【JUC】Executors 之 newSingleThreadScheduledExecutor 应用场景:部门领导 ping ip 判断同学们是否已到工位

JAVA线程池SingleThreadScheduledExecutor实践教程 是 Java 中的一个调度线程池,它保证所有调度任务在单个线程中按顺序执行。以下是如何在实践中使用。 阅读详情

Executors 之 newSingleThreadScheduledExecutor
应用场景一:部门领导 ping ip 判断同学们是否已到工位
就问你这招狠不狠?这应用场景都能想出来,还有谁?

talk is cheap, show me the code.

PingIP.java

package com.iptlh.tools;

import java.io.IOException;
import java.net.InetAddress;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author: tanpeng
 * @since: 2020-05-28 10:08
 */
public class PingIP {

    private static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    private static LocalTime latestTime = LocalTime.of(14, 0);

    private static HashMap<String, String> allIP = new HashMap<>();
    private static Set<String> offlineIP;

    static {
        allIP.put("192.168.0.152", "王二");
        allIP.put("192.168.0.153", "张三");
        allIP.put("192.168.0.154", "李四");
        allIP.put("192.168.0.126", "赵六");
        allIP.put("192.168.0.87" , "孙七");
        allIP.put("192.168.0.88" , "周八");
        allIP.put("192.168.0.199", "罗九");

        // 默认所有IP均为离线
        offlineIP = allIP.keySet();
    }

    public static void main(String[] args) {
        if (LocalTime.now().isAfter(latestTime)) {
            System.out.println("亲现在已经是正式上班时间了呢!会不会是你迟到了呢?(*^__^*) 嘻嘻");
            return;
        }

        ScheduledExecutorService singleThreadScheduledPool = Executors.newSingleThreadScheduledExecutor();
        singleThreadScheduledPool.scheduleAtFixedRate(() -> {
            if (offlineIP.isEmpty() || LocalTime.now().isAfter(latestTime)) {
                singleThreadScheduledPool.shutdown();
                System.out.format("[%s] 迟到的同学共[%s]人 - %s",
                        dateTimeFormatter.format(LocalDateTime.now()),
                        offlineIP.size(),
                        offlineIP.stream().map(ip -> allIP.get(ip)).collect(Collectors.toList()).toString());
            } else {
                pingOfflineIP(offlineIP);
                System.out.format("[%s] 未上线同学共[%s]人 - %s\n",
                        dateTimeFormatter.format(LocalDateTime.now()),
                        offlineIP.size(),
                        offlineIP.stream().map(ip -> allIP.get(ip)).collect(Collectors.toList()).toString());
                System.out.println();
            }
        }, 1, 10, TimeUnit.SECONDS);
    }

    /**
     * 核心业务
     * ping离线IP
     *
     * @param ipList
     */
    private static void pingOfflineIP(Collection<String> ipList) {
        // IP可达性断言
        Predicate<String> isReachable = ip -> {
            try {
                InetAddress inetAddress = InetAddress.getByName(ip);
                return inetAddress.isReachable(1000);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        };
        Set<String> onlineIP = ipList.stream().filter(isReachable).collect(Collectors.toSet());
        // 发送IP上线通知
        onlineIP.forEach(PingIP::notice);
        // 已上线IP断言
        Predicate<String> isOnlineIP = onlineIP::contains;
        // 更新离线IP
        offlineIP = ipList.stream().filter(isOnlineIP.negate()).collect(Collectors.toSet());
    }

    /**
     * 发送上线通知
     *
     * @param ip
     */
    private static void notice(String ip) {
        System.out.format("[%s] %s(%s)\t 已上线...\n",
                dateTimeFormatter.format(LocalDateTime.now()),
                allIP.get(ip), ip);
    }

}

控制台输出

[2020/05/28 13:18:20] 孙七(192.168.0.87)	 已上线...
[2020/05/28 13:18:20] 赵六(192.168.0.126)	 已上线...
[2020/05/28 13:18:20] 罗九(192.168.0.199)	 已上线...
[2020/05/28 13:18:20] 王二(192.168.0.152)	 已上线...
[2020/05/28 13:18:20] 未上线同学共[3]人 - [周八, 李四, 张三]

[2020/05/28 13:18:27] 未上线同学共[3]人 - [周八, 李四, 张三]

[2020/05/28 13:18:39] 周八(192.168.0.88)	 已上线...
[2020/05/28 13:18:39] 未上线同学共[2]人 - [李四, 张三]

[2020/05/28 13:18:49] 未上线同学共[2]人 - [李四, 张三]

[2020/05/28 13:18:59] 未上线同学共[2]人 - [李四, 张三]

...

[2020/05/28 14:00:01] 迟到的同学共[2]人 - [李四, 张三]
《Java并发库系列三》一newSingleThreadScheduledExecutor newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,如果任务多于一个,任务将按先后顺序执行。 1、继承结构 构造函数 包含一个定时的service public static ScheduledExecutorService newSingleThreadScheduledE... 阅读详情

相关推荐

S4 Hana SD -信贷管理 - 03

自动信用控制将针对同一信用控制范围的不同的客户风险类别和信贷组执行不同的信用控制政策。对于ECC系统而言,无需单独设置检查规则,可在自动信贷控制进行设置即可,如图1-5-2。在S4 HANA版本中,自动信贷控制和检查规则是分离的。S4系统需要在定义自动信贷控制的时候,给字段“SAP信用管理”打钩,激活检查规则,然后需要单独在检查规则页签设置检查规则。接下来,我们分别介绍ECC和S4 HANA系统中两种不同配置方式.6.2SPRO。

weixin_46525734的博客 2887

JAVA ThreadPoolExecutor 线程池keepAliveTime的终极含义

corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程...

DreamWeaver_Zhou 1万+

Xilinx System Generator多速率系统(Multi-Rate Systems)的使用

在本实验练习中,您将学习在System Generator中如何使用多个时钟域有效地实现具有多个数据速率的设计。

白码王子小张的博客 1092

Java线程池的四种用法与使用场景

一、如下方式存在的问题new Thread() { @Override public void run() { // 业务逻辑 }...

程序员小灰的博客 3423

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2208

别再死记硬背了!用LabVIEW串口通信的3个真实项目案例,手把手教你从调试到部署

本文通过3个真实项目案例,详细讲解LabVIEW串口通信从调试到部署的全过程。涵盖Arduino温湿度监控、西门子PLC Modbus通信以及高可靠性通信框架设计,提供实用技巧和常见问题解决方案,帮助工程师快速掌握LabVIEW串口通信的实战应用。

weixin_30485379的博客 522

Java线程池从使用到阅读源码(3/10)

我们一般不会选择直接使用线程类Thread进行多线程编程,而是使用更方便的线程池来进行任务的调度和管理。线程池就像共享单车,我们只要在我们有需要的时候去获取就可以了。甚至可以说线程池更棒,我们只需要把任务提交给它,它就会在合适的时候运行了。但是如果直接使用Thread类,我们就需要在每次执行任务时自己创建、运行、等待线程了,而且很难对线程进行整体的管理,这可不是一件轻松的事情。既然我们已经有了线程...

weixin_34378045的博客 295

Anylogic试用版密匙

#$%99dTMbLIj+hm/c9fn0suWlfQjdK9FzRH8oSbR Rbm3FEeONkF5mDLKHxhscEDBANDg4BSU2Oi6hErk TH/KzwiCtsM0jfD50uRsj60+gi9ifTlduwcpSr6a GtVSilXwF997xTVAoMLddqOzGQAbnSjBiJOBdm1Z 0QwwIEJynvYgckLfoEADzncIgNnJjYshWcmGh3s9 gTgyuQPlRBeTXfb+ZJPI1JGi4sAUljwdB53Df+AX SEf5FaIbih

qq_43939616的博客 8264

newsinglethreadexecutor使用场景_java中Future的使用

Future是java 1.5引入的一个interface,可以方便的用于异步结果的获取。 本文将会通过具体的例子讲解如何使用Future。创建Future正如上面所说,Future代表的是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在Future中。那么我们什么时候会用到Future呢? 一般来说,当我们执行一个长时间运行的任务时,使用Future就可以让我们暂时去处理其他的任务...

weixin_39569747的博客 577

论文阅读:Universal and Transferable Adversarial Attacks on Aligned Language Models. LLM Attacks

因为“即开即用”的大型语言模型能够生成大量令人反感的内容,近期的工作集中在对这些模型进行对齐,以防止不受欢迎的生成。尽管在规避这些措施方面取得了一些成功——即所谓的针对大型语言模型(LLMs)的“越狱”——这些攻击需要大量的人类智慧,并且在实践中很脆弱。自动对抗性提示生成的尝试也取得了有限的成功。在本文中,我们提出了一种简单有效的攻击方法,可以导致对齐的语言模型生成令人反感的行为。

CSPhD-winston的博客 1414

【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

前言、 一、线程池示例、 二、newCachedThreadPool 线程池示例、 三、newFixedThreadPool 线程池示例、 三、newSingleThreadExecutor 线程池示例、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1706

YOLO26改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力YOLO26精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 193

java线程池

为什么用使用线程池 1.降低资源消耗:很多线程执行的时间很短,如果每次需要执行线程都去创建和销毁线程,会产生很多不必要的开销。 2.提高线程的可管理性 Executors类 大致结构:在Executors类中,定义了几个静态内部类,如: DelegatedExecutorService FinalizableDelegatedExecutorService DelegatedSched...

u_will_c的博客 1002

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Executors.newSingleThreadScheduledExecutor()实现定时任务 并解决其发生异常时卡死状态

最近工作中用Executors.newSingleThreadScheduledExecutor()实现了一个定时任务 该任务会在一次任务执行完毕后的间隔时间才会执行下一次任务 import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.ut...

w772397262的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

多线程-线程池-

多线程-线程池

Imzhipo的博客 832

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【JUC】Executors 之 newSingleThreadScheduledExecutor 构建定时任务/延时任务

Executors 之 newSingleThreadScheduledExecutor 构建定时任务/延时任务.

tanpenggood 5469

java架构师 并发编程之线程池原理分析

1、创建线程池的方式 线程池创建有七种方式,最核心的是最后一种: (1)newSingleThreadExecutor(): 它的特点在于工作线程数目被限制为1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目; (2)newCachedThreadPool(): 它是一种用来处理大量短时间...

夏沐的博客 682

深入学习Java中的线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。创建自定义线程池,参数可自定义配置。:线程池的基本大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。

摸鱼胖嘟嘟的博客 1681

线程池用法详解

线程池用法详解 前言 为什么需要用到线程池? 众所周知线程是操作系统一种宝贵的资源,创建和销毁都很耗费资源,对此,java中针对这种情况实现出线程池思想,维护一定数量的线程,用到时候就不需要去创建,不使用时候,就销毁一定量的,保留一部分线程数量。 Java线程池的工作流程 Java线程池的工作流程为:线程池刚被创建时,只是向系统申请一个用于执行线程队列和管理线程池的线程资源。在调用execute()添加一个任务时,线程池会按照以下流程执行任务。 如果正在运行的线程数量少于corePoolSize(用户定

. 1694

SingleThreadScheduledExecutor线程池设计/场景案例/性能调优/场景适配(架构篇)

在多线程编程中,我们经常会遇到需要按特定顺序执行任务的场景,例如定时任务、周期性任务或者保证任务执行顺序的情况。`SingleThreadScheduledExecutor` 正是为了满足这样的需求而设计的。它提供了一个单一的后台线程,用于顺序执行所有提交的任务,确保了任务的执行顺序与提交顺序相同。这种线程池特别适用于那些对任务执行顺序有严格要求的应用,如日志处理、事件调度等。通过 `SingleThreadScheduledExecutor`,我们可以轻松地安排任务在未来的某个时间点执行,或者以固定的频率

肖哥弹架构博客 1297

java多线程

java多线程

MaYingBo928的博客 319

线程池的创建方式

转自https://blog.youkuaiyun.com/weixin_39771749/article/details/123576797 在 Java 语言中,并发编程都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景,总体来说线程池的创建可以分为以下两类: 而以上两类创建线程池的方式,又有 7 种具体实现方法,这 7 种实现方法分别是: Executors.newFixedThreadPool:创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等

TPH_BETTER.的博客 2004

Java线程池知识点整理

Java线程池 最近生产环境的线程池出现了队列中的线程阻塞过多导致服务器不可用的情况,所以借此机会,仔细研究了一波线程池。在学习了大神的文章后,做了如下的总结和整理。 使用线程池的优势 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建...

程序猿爱生活 838

Java四种线程池 newCachedThreadPool ,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 1、new Thread的弊端 1 2 3 4 5 6 7 newThread(newRunnable() { @O...

4617

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingle

转自:https://www.cnblogs.com/baizhanshi/p/5469948.html 1、new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java   1 2 3 4 5 6 7 new Thread(new Runnable() {    ...

zhaofuqiangmycomm的博客 3090
上一篇: 【JUC】Executors 之 newSingleThreadScheduledExecutor 构建定时任务/延时任务
下一篇: 【JAVA】JDK动态代理初探之Proxy.newProxyInstance
tanpenggood
博客等级 码龄9年 129粉丝 197原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值