栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java并发编程系列32:线程池shutdown()和exs.isTerminated()结合使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java并发编程系列32:线程池shutdown()和exs.isTerminated()结合使用

出现问题:线程池就一直存在,程序停滞

线程池使用时,如果没有使用shutdown()去停止时,线程池就一直存在,程序停滞。

package runnable;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;



class Runnable5 implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<10000;i++){
            if(i==999){
                System.out.println(Thread.currentThread().getName()+",线程在执行:"+i);
            }
        }
    }
}

public class ThreadPoolDemo5 {
    public static  void main(String[] args) {
        //创建Runnable 对象
        Runnable5 rt = new Runnable5();
        int ThreadNum=10;
        ExecutorService exs = Executors.newFixedThreadPool(ThreadNum);
        for(int i=0;i 

执行结果:

 解决方法:shutdown()停止,isTerminated()判断是否结束

多线程中使用线程池,例如:newFixedThreadPool 等4种线程池或自定义线程池时,需要使用停止线程,并需要判断是否线程池是否停止。

具体方法:

  • shutdown(),它可以安全地关闭一个线程池

调用 shutdown() 方法之后线程池并不是立刻就被关闭,因为这时线程池中可能还有很多任务正在被执行,或是任务队列中有大量正在等待被执行的任务,调用 shutdown() 方法后线程池会在执行完正在执行的任务和队列中等待的任务后才彻底关闭。

调用 shutdown() 方法后如果还有新的任务被提交,线程池则会根据拒绝策略直接拒绝后续新提交的任务。

        exs.shutdown();
        Runnable5 rt2 = new Runnable5();
        exs.execute(rt2);

  •  isTerminated() 判断方式,在执行 shutdown() ,关闭线程池后,判断是否所有任务已经完成。

    这个方法可以检测线程池是否真正“终结”了,这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了。

    直到所有任务都执行完毕了,调用 isTerminated() 方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。

package runnable;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;



class Runnable5 implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<10000;i++){
            if(i==999){
                System.out.println(Thread.currentThread().getName()+",线程在执行:"+i);
            }
        }
    }
}



public class ThreadPoolDemo5 {
    public static  void main(String[] args) {
        //创建Runnable 对象
        Runnable5 rt = new Runnable5();
        int ThreadNum=10;
        ExecutorService exs = Executors.newFixedThreadPool(ThreadNum);
        for(int i=0;i 

执行结果:

第一次判断线程池如果未结束,休眠1秒钟再去判断(循环判断),知道线程池结束。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号