文档章节

Java并发编程高级篇(六):在执行器中延时执行任务

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2017/03/02 09:35
字数 645
阅读 63
收藏 0

执行器框架提供了ThreadPoolExecutor类来执行Runnable和Callable任务。当任务被发送给执行器的时候,执行器会根据俄配合尽可能快地执行任务。但是如果我们不想让任务马上执行,而是想让任务过一段时间后再执行,或者周期性地执行,该怎么办呢。为了达到这个目的,执行器框架为我们提供了ScheduledThreadPoolExecutor类。

下面我们看一下如何使用这个类来实现延迟执行任务。

首先我们创建一个任务类,实现Callable接口,泛型类型为String。这个任务在控制台打印执行时间,并返回Hello World。

import java.util.Date;
import java.util.concurrent.Callable;

/**
 * 新建Task类并实现Callable<String>接口
 *
 * 打印当前任务名+执行时间
 *
 * Created by hadoop on 2016/11/3.
 */
public class Task implements Callable<String> {
    private String name;

    public Task(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        System.out.printf("%s: Starting at : %s\n", name, new Date());
        return "Hello World!";
    }
}

接下来我们实现主类main方法。首先通过执行器工厂Executors类的newScheduledThreadPool()方法来创建一个定时执行器,这个方法接收一个参数作为线程池最大线程数。接下来创建5个线程,并调用schedule方法来执行线程,每个线程都给定一个延迟执行时间,每个线程的延迟时间都间隔一秒。

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

/**
 * 在执行器中延迟执行任务
 *
 * 我们把任务发送给执行器框架,任务会马上执行,如果你想让任务在过一段时间后才执行,那么你需要使用ScheduledThreadPoolExecutor。
 *
 * 创建五个任务,使用ScheduledThreadPoolExecutor的schedule(Callable<V> callable,long delay,TimeUnit unit)方法来执行。
 * 这个方法接受三个参数(实现Callable接口的任务,延迟执行时间,时间单位)
 *
 * 如果需要执行任务执行的时间点,那么你需要计算当前时间与任务执行时间之间的时间间隔。
 *
 * Created by hadoop on 2016/11/3.
 */
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(1);

        for (int i = 1; i <= 5; i++) {
            Task task = new Task(String.valueOf(i));
            executor.schedule(task, i, TimeUnit.SECONDS);
        }

        executor.shutdown();

        executor.awaitTermination(1, TimeUnit.DAYS);
    }
}

执行结果,可以看到每个任务都比上一个任务延迟一秒执行。

1: Starting at : Sat Feb 25 21:38:49 CST 2017
2: Starting at : Sat Feb 25 21:38:50 CST 2017
3: Starting at : Sat Feb 25 21:38:51 CST 2017
4: Starting at : Sat Feb 25 21:38:52 CST 2017
5: Starting at : Sat Feb 25 21:38:53 CST 2017

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
684
1
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
733
1
Java并发教程-7高级并发对象

目前为止,该教程重点讲述了最初作为Java平台一部分的低级别API。这些API对于非常基本的任务来说已经足够,但是对于更高级的任务就需要更高级的API。特别是针对充分利用了当今多处理器和多核...

noday
2014/04/25
947
0
分布式定时任务框架---Uncode Schedule

分布式定时任务框架---Uncode Schedule rabbitGYK 关注 2016.11.27 20:36* 字数 1446 阅读 7141评论 5喜欢 36赞赏 1 博客原文 作为一个支付公司的项目组,经常会有很多对账功能(签约对账、支...

晨猫
2018/11/02
135
0
Java 并发:Executors 和线程池

本文译自:Java Concurrency – Part 7 : Executors and thread pools 让我们开始来从入门了解一下 Java 的并发编程。 本文主要介绍如何开始创建线程以及管理线程池,在 Java 语言中,一个最...

红薯
2010/09/15
34.2K
18

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
2
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部