Java ExecutorService生命周期

ExecutorService接口继承了Executor接口,定义了一些生命周期的方法

public interface 

ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
}

本文,我们逐一分析里面的每个方法。

首先,我们需要创建一个任务代码,这段任务代码 主要是随机生成含有10个字符的字符串

/**
 * 随机生成10个字符的字符串
 * @author dream-victor
 *
 */
public class Task1 implements Callable<String> {  

    @Override
    public String call() throws Exception {
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 10; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }  

}

然后,我们还需要一个长任务,这里我们默认是沉睡10秒

/**
 * 长时间任务
 *
 * @author dream-victor
 *
 */
public class LongTask implements Callable<String> {  

    @Override
    public String call() throws Exception {
        TimeUnit.SECONDS.sleep(10);
        return "success";
    }  

}

OK,所有前期准备完毕,下面我们就来分析一下ExecutorService接口中和生命周期有关的这些方 法:

1、shutdown方法:这个方法会平滑地关闭ExecutorService,当我们调用这个方法时, ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已 经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。这 里我们先不举例在下面举例。

2、awaitTermination方法:这个方法有两个参数,一个是timeout即超 时时间,另一个是unit即时间单位。这个方法会使线程等待timeout时长,当超过timeout时间后,会监测 ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用 。例如:

ExecutorService service = Executors.newFixedThreadPool(4);
service.submit(new Task1());
service.submit(new Task1());
service.submit(new LongTask());
service.submit(new Task1());  

service.shutdown();  

while (!service.awaitTermination(1, TimeUnit.SECONDS)) {
    System.out.println("线程池没有关闭");
}
System.out.println("线程池已经关闭");

这段代码中,我们在第三次提交了一个长任务,这个任务 将执行10秒沉睡,紧跟着执行了一次shutdown()方法,假设:这时ExecutorService被立即关闭,下面调用 service.awaitTermination(1, TimeUnit.SECONDS)方法时应该返回true,程序执行结果应该只会打印出:“ 线程池已经关闭”。但是,真实的运行结果如下:

线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池没有关闭
线程池已经关闭

这说明我们假设错误,service.awaitTermination(1, TimeUnit.SECONDS)每隔一秒 监测一次ExecutorService的关闭情况,而长任务正好需要执行10秒,因此会在前9秒监测时ExecutorService 为未关闭状态,而在第10秒时已经关闭,因此第10秒时输出:线程池已经关闭。这也验证了shutdown方法关闭 ExecutorService的条件。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索线程
, 方法
, service
, java 线程池
, timeunit
, shutdown
, 任务
, ExecutorService
, 关闭方法
, 执行周期性任务
, 关闭线程
Callable接口
java service生命周期、java executorservice、service生命周期、service的生命周期、安卓service生命周期,以便于您获取更多的相关知识。

时间: 2024-08-31 08:11:49

Java ExecutorService生命周期的相关文章

java对象生命周期-一个对象被垃圾收集器回收了为什么还要卸载

问题描述 一个对象被垃圾收集器回收了为什么还要卸载 一个对象被垃圾收集器回收了为什么还要卸载?被gc回收了不是已经不存在了吗? 解决方案 说反了吧,先卸载才能回收 http://www.cnblogs.com/mengdd/p/3594608.html 解决方案二: 自己 Delete 可靠一些,且实时性高. 靠 GC 不知道是什么时候才能收回.

java的线程机制(二) Thread的生命周期

之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会 执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是alive(活跃)的,而且我们还可以通 过isAlive()方法来确定该线程是否启动还是终结. 一旦启动Thread后,我们就只能执行一个方 法:run(),而run()方法就是负责执行Thread的任务,所以终结Thread的方法很简单,就是终结run()方法.仔 细查看文档,我们会发现里面有一个

Java 线程的生命周期详细介绍及实例代码_java

当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过"新建(New)"."就绪(Runnable)"."运行(Running')"."阻塞(Blocked)"和"死亡(Dead)"五种状态.线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行.阻塞之间切换.  一.线程的状态 线程的存在有几种不同的状态,如下: New

浅谈Java生命周期管理机制_java

先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然只写以下几行代码,于是我感觉瞬间受到了很多伤害. public static void main(String[] args) { System.out.println(new Date() + ",server shutdown!"); } 这个中间件启动和运行的时候,开启了监听,启动着

[翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者postRestart方法,当我们讨论supervision时候我们会说这个) 基本的Actor生命周期很直观.除了一点小不同,你可以直接拿基本Actor生命周期与Java Servlet生命周期作比较. 像其他常规类一样,我们有一个构造函数. preStart方法会被调用. 这里你可以在postStop

Java Servlet Programming 读书笔记 - servlet生命周期

servlet|笔记 servlet的生命周期一般为: 1.建立初始化servlet 2.处理从客户端的零个或多个请求 3.销毁servlet,gc回收占用内存 每个server可能在如何支持servlet上有不同的方法,但是上述servlet生命周期却是每个servlet 引擎必须遵守的规则. 实例持久化Instance Persistence: 一个servlet 实例一旦加载,就开始处理对这个servlet的所有请求,换句话说就是一个servlet只生成一个实例.这样的做法对于性能的提高很

Java开发平台中的生命周期管理

对象的生命周期没有大家想的那么复杂.其实其就是回答了两个简单的问题.什么时候需要创建对象? 什么时候把对象消亡?这两个问题解决了,那么对象的生命周期问题也就解决了. 一.传统的对象生命周期管理方法. 为了对Java开发平台中的生命周期管理方法有一个更加深刻的理解,笔者认为大家需要对传统的生命 周期管理方法先有一个了解.因为这有助于大家有一个相互的对比,从而会对Java语言中的生命周期管理 方法会有一个比较直观的印象. 在传统的编程语言中,如C语言,其考虑对象的生命周期,主要是从对象与应用程序的执

Java对象的生命周期与作用域的讨论(转)

导读: Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间.由此,我们可以看出,只有T2是真正有效的时间,而T1.T3则是对象本身的开销.下面再看看T1.T3在对象的整个生命周期中所占的比例. 我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用.另外,默认情况下,调用

java线程的生命周期

1.线程的生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程.每个Java程序至少包含一个线程:主线程. (1)线程生命周期的五种状态 1.创建(当用new 创建完一个线程对象后,该线程处于新建状态) 2.就绪(当线程对象调用了start()后,该线程处于就绪状态) 3.执行(如果处于就绪状态的线程获得CPU时间片,开始执行run方法的线程执行体,该线程处于运行状态) 4.阻塞(如果线程调用了sleep().join()或者调用了一个阻塞式IO方法等,该线程处于阻塞状态) 5.死亡