4 - 线程池 Java内置的线程池 - ScheduledExecutorService

news2025/1/12 18:20:17

ScheduledExecutorService

        ScheduledExecutorService是ExecutorService的子接口,具备了延迟运行或定期执行任务的能力。

1、常用获取方式 

注:还是通过 Executors. 的方式进行调用

1)static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 

 ——  创建一个可重用固定线程数的线程池且允许延迟运行或(重复/)定期执行任务

static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)          

—— 创建一个可重用固定线程数的线程池,且线程池中的所有线程都使用ThreadFactory来创建,且允许延迟运行或定期执行任务

2)static ScheduledExecutorService newSingleThreadScheduledExecutor()          

—— 创建一个单线程执行程序,它允许在给定延迟后运行命令或者(重复/)定期地执行任务

static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)            

—— 创建一个单线程执行程序,且线程池中的所有线程都使用ThreadFactory来创建,且允许在给定延迟后运行命令或者定期地执行任务

2、常用方法

<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)          

—— 延迟时间单位是unit,数量是delay的时间后执行callable

ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)          

—— 延迟时间单位是unit,数量是delay的时间后执行command   

下面的方法可以重复执行任务:(两种间隔方式)

ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)     

 ——  延迟时间单位是unit,数量是initialDelay的时间后,每间隔period时间重复执行一次command

 ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)          

—— 创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟(即:同上面一样,也是重复执行,但是,延迟时间是从第一次(仅仅是第一次?还是每次?:每一次)重复/执行完后的时间开始算起的

示意图:

上面是scheduleAtFixedRate(...),下面是scheduleWithFixedDelay(...)

 3、代码示例

(1)最简单的延迟执行(一个或多个任务)

 ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)

package com.zhoulz.demo03;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 测试ScheduledExecutorService接口中延迟执行任务和重复执行任务的功能
 */
public class ScheduledExecutorServiceDemo01 {
    public static void main(String[] args) {
        // 1、获取一个具备延迟执行任务的线程池对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(3);
        // 2、创建多个任务对象,提交任务,每个任务延迟2秒执行
        // (同样,这个任务可以单独创建一个类,也可以通过匿名内部类的方式)
        // 提交任务用方法,而不是submit()方法了

        // 下面先提交一个任务
        //es.schedule(new MyRunnable(666),2, TimeUnit.SECONDS);
        // 提交多个任务—— 通过for循环
        for (int i = 1; i <= 10; i++) {
            es.schedule(new MyRunnable(i),2, TimeUnit.SECONDS);
        }

        // 下面这个打印是在main方法中的,不会延迟。
        // 所以,正常情况是:打印“over”后,延迟2秒后执行任务
        System.out.println("over");
    }
}

class MyRunnable implements Runnable{
    private int id;

    public MyRunnable(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + "执行了任务:" + id);
    }
}

结果:

(2)只执行一个任务,但是使其重复执行

ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

package com.zhoulz.demo03;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * 测试ScheduledExecutorService接口中延迟执行任务和重复执行任务的功能
 */
public class ScheduledExecutorServiceDemo02 {
    public static void main(String[] args) {
        // 1、获取一个具备延迟执行任务的线程池对象
        ScheduledExecutorService es = Executors.newScheduledThreadPool(3, new ThreadFactory() {
            int n = 1;
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r,"自定义的线程名zlz:"+ n++);
            }
        });
        // 2、创建多个任务对象,提交任务,每个任务延迟2秒执行
        // (匿名内部类的方式,见上面)

        // 下面不再提交多个任务,而是就提交1个任务,并让其重复执行
        // 初识延迟1秒,间隔2秒
        es.scheduleAtFixedRate(new MyRunnable2(666),1,2,TimeUnit.SECONDS);

        // 提交多个任务—— 通过for循环
        /*for (int i = 1; i <= 10; i++) {
            es.schedule(new MyRunnable2(i),2, TimeUnit.SECONDS);
        }*/
        System.out.println("over");
    }
}

class MyRunnable2 implements Runnable{
    private int id;

    public MyRunnable2(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        // 模拟任务执行时间1.5秒,这个1.5秒是在间隔时间2秒钟之类的
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "执行了任务:" + id);
    }
}

结果:

 (3)只执行一个任务,但是使其重复执行

区别于(2),所用的是scheduleWithFixedDelay()方法 —— 来提交任务

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

同时,获取线程的方式用的是:

(即单线程的,见下面,(2)用的是指定线程newScheduledThreadPool() 

static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)  -—— 且所有线程都使用ThreadFactory(线程工厂)来创建

package com.zhoulz.demo03;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * 测试ScheduledExecutorService接口中延迟执行任务和重复执行任务的功能
 */
public class ScheduledExecutorServiceDemo03 {
    public static void main(String[] args) {
        // 1、获取一个具备延迟执行任务的线程池对象
        ScheduledExecutorService es = Executors.newSingleThreadScheduledExecutor( new ThreadFactory() {
            int n = 1;
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r,"自定义的线程名zlz:"+ n++);
            }
        });
        // 2、创建多个任务对象,提交任务,每个任务延迟2秒执行

        // 下面不再提交多个任务,而是就提交1个任务,并让其重复执行
        // 初识延迟1秒,间隔2秒
        es.scheduleWithFixedDelay(new MyRunnable3(666),1,2,TimeUnit.SECONDS);

        System.out.println("over");
    }
}

class MyRunnable3 implements Runnable{
    private int id;

    public MyRunnable3(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        // 模拟任务执行时间2秒,所以每间隔2+2=4秒后,才会有一次任务输出
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "执行了任务:" + id);
    }
}

结果:任务输出之间间隔了4秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5702开发板用户手册

一、 底板简介 1.1 产品简介 在这里&#xff0c;对这款 MP5702 开发板底板进行简单的功能介绍。本公司相关核心板都可与其对接&#xff0c;型号如 MP5652&#xff08;请详见用户手册&#xff09;。底板核心板的模式来设计组成完整的开发。底板和核心板之间使用高速板间连接器连…

EMCC 中 运用SQL 优化的建议

1. 性能中心 关于SQL的执行信息 2. 优化SQL&#xff1a; ------整个过程SQL 实现---------------------- DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext : SELECT * || FROM sales || WHERE prod_id 10 AND || cust_id …

Android穿戴设备新功能Compose for Wear OS 1.1

Todoist的增长率提高了50%&#xff0c;因为为Wear 3和Outdooractive重建了他们的应用程序&#xff0c;将开发时间缩短了30%&#xff0c;并显着提高了开发人员的生产力和更好的设计/开发人员协作&#xff1a; “Compose 使 UI 代码更易于编写和阅读&#xff0c;使我们能够在设计…

倍福:通过读取FB_EcCoESdoRead第三方伺服的COE参数,例如力矩等信息

本文介绍通过PLC读取第三方伺服的COE参数。例如力矩等信息 功能块介绍 首先需要用到的功能块为FB_EcCoESdoRead,该参数是读取COE online中的数据。PLC程序编写 首先扫描程序配置,并链接好NC变量如下所示然后再COEOnline中确定需要读取的变量的地址如下所示: 确定所在主站的…

shell 基本语法第一讲之(变量的使用、文件名替换和参数扩展、命令代换、算术代换、单引号、双引号)

1、变量的使用 #!/usr/sh #1、声明即赋值 注意:等号两边不能留空格&#xff0c;留了空格就编程一个命令两个参数 varNamename #2、使用变量 $varName ${varName}2、变量的分类 shell 内变量在shell的解析环境中存在的变量全局范围的变量(全局变量)shell中*不使用任何修饰符修…

【C++修炼之路】11. list类

每一个不曾起舞的日子都是对生命的辜负 list本节目标1. list的介绍及使用1.1 list的介绍1.2 list的使用1.3 模拟list节点的结构1.4 list类的封装补充&#xff1a;list的自带排序函数1. sort2. unique2. list的迭代器2.1 list的迭代器失效问题2.2 迭代器的分类2.3 迭代器的模拟实…

java基于Springboot的校园新闻网站-计算机毕业设计

项目介绍 本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园新闻网站的当前背景以及系统开发的目的…

阿里全心打造,“Java核心精选宝册”助成长,面试实战一步到位

一、前言 接下来就是即将到来的金三银四了&#xff0c;这个时期是面试跳槽的高峰期&#xff0c;果不其然&#xff0c;有很多的朋友私信给我&#xff0c;询问我有没有对金三银四有帮助的一些笔记可以分享&#xff0c;所以就有了这篇文章&#xff0c;下面会大概的展示一下笔记的…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day12

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三明年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…

论文投稿指南——中文核心期刊推荐(电子、通信技术3)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384;&#x1f388; 核心期刊在国内的应用范围非常广&#xff0c;核心期刊发表很多是国内作者晋升中的硬性要求&#xff0c;在…

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50(附源码、数据库)

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

Zebec获BNB Chain生态大力支持,ZBC通证将陆续登录一线平台

在行业早期开始&#xff0c;流支付赛道就已经具备了早期的轮廓&#xff0c;而在流支付协议Zebec Protocol出现后&#xff0c;该领域被推向了一个新的发展高度&#xff0c;并得到加密领域以及传统商业领域的高度关注。而随着生态的商业进展不断推进、生态不断壮大&#xff0c;Ze…

解决 PHPMYADMIN 无法导入大数据库文件方法

有个运营多年的海外站点需要搬迁服务器,备份好数据库后,通过 phpmyAdmin 面板导入数据库时发现有文件大小限制,最大导入 100M 的数据库文件,自己的数据库备份文件足足有 175M,平时都是通过 Navicat 导入也没注意,刚好遇见问题那么就选择解决问题。 解决方法 1、在 phpM…

docker构建vue项目镜像并发布到dockerhub中使用

先将本地vue项目打包为一个镜像&#xff0c;不会的可以看文章&#xff1a;使用docker构建vue项目并成功运行在本地和线上_1024小神的博客-CSDN博客 然后开始注册一个dockerhub账号并登陆&#xff1a;然后点击 create repository Docker Hub 开始填写仓库名称和描述&#xff1…

什么是WMS?有哪些好用的wms仓库管理系统推荐?

通过本篇文章&#xff0c;您将了解以下问题&#xff1a;1、WMS是什么&#xff1f;使用价值有哪些 2、国内有哪些好用的WMS仓库管理系统推荐&#xff1f; 一、WMS是什么&#xff1f; WMS是仓库管理系统(Warehouse Management System) 的缩写。WMS仓库管理系统综合了产品的入库、…

关于 ABAP 开发对象的原始语言版本(Original Language)

当创建新的存储库对象时&#xff0c;例如 ABAP 词典中的程序、类或数据库表&#xff0c;必须指定其原始语言。ABAP 开发框架隐式将当前登录语言设置为其原始语言。 作为开发项目中开发对象的一部分创建的所有可翻译文本&#xff08;包括描述性短文本和长文本、程序的文本元素以…

uni-app DAY08

复习&#xff1a; 1、uni-app中常用组件 ①内置组件&#xff1a;页面(page)、视图(view)、滚动视图(scroll-view)、文本(text)、富文本(rich-text)、图片(image)、输入框(input)、按钮(button)、导航器/超链接(navigator)、轮播(swiper)、拾取器/下拉菜单/选择器(picker)、单…

云弹性:它如何影响云计算?

云弹性是云计算最重要的特性之一。云弹性是指云提供商根据企业流程的需求向该流程提供资源的过程。云提供商拥有自动交付或删除资源的系统&#xff0c;以便为每个项目提供适当数量的资产。对于云用户来说&#xff0c;他们将被赋予足够的权力来运行他们的工作流&#xff0c;而不…

Java高级——Graal编译器介绍

Graal编译器介绍 Graal编译器由Java实现&#xff0c;支持提前编译和即时编译 JDK9推出Java虚拟机编译器接口&#xff08;Java-Level JVM CompilerInterface&#xff0c;JVMCI&#xff09;&#xff0c;将Graal从HotSpot代码中独立出来&#xff08;即可外部挂载&#xff09; 构…

Klarf 文件可视化工具

1.技术框架 1.1 前端&#xff1a; Vue3 网页版Electron Quasar 可生成 EXE、APK 等客户端Element-Plus 控件axios 跨域 1.2 后端&#xff1a; Flask 提供接口 2. Web 版和客户端版 2.1 Web 版页面 2.2 客户端界面 2.3 使用流程 在 SenseTools-Klarf-Parser/data/test_f…