• 线程池


    /*shutdown 方法将执行平缓的关闭过程:不在接受新的任务,同时等待已经提交的任务执行完成---包括那些还未开始执行的任务。
    shutdown():
    将线程池状态置为SHUTDOWN,并不会立即停止:
    1)停止接收外部submit的任务
    2)内部正在跑的任务和队列里等待的任务,会执行完
    3)等到第二步完成后,才真正停止

    shutdownNow 方法将执行粗暴的关闭过程:他将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。
    shutdownNow():
    将线程池状态置为STOP。企图立即停止,事实上不一定:
    1)跟shutdown()一样,先停止接收外部提交的任务
    2)忽略队列里等待的任务
    3)尝试将正在跑的任务interrupt中断
    4)返回未执行的任务列表
    SM:它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,
    如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。
    所以,ShutdownNow()并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。
    但是大多数时候是能立即退出的

    isShutdown 判断之前是否调用过shutdown
    isTerminated 判断所有提交的任务是否完成(保证之前调用过shutdown方法)

    awaitTermination 调用shutdown方法后,等待所有任务执行完成
    当前线程阻塞,直到
    1)等所有已提交的任务(包括正在跑的和队列中等待的)执行完
    2)或者等超时时间到
    3)或者线程被中断,抛出InterruptedException
    4)然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

    【shutdown()和awaitTermination()的区别】
    shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。
    awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。

    【总结】
    1)优雅的关闭,用shutdown()
    2)想立马关闭,并得到未执行任务列表,用shutdownNow()
    3)优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()
    4)关闭功能 【从强到弱】 依次是:shuntdownNow() > shutdown() > awaitTermination()*/

    //0
    /*pool.shutdown();//只是不能再提交新任务,等待执行的任务不受影响
    while (!pool.isTerminated()) {
    pool.awaitTermination(3, TimeUnit.SECONDS);
    }
    System.out.println("线程池已经关闭,线程池中的任务全部执行完毕!");*/

    //1
    /*while (!pool.awaitTermination(3, TimeUnit.SECONDS)) {
    System.out.println("isTerminated:" + service.isTerminated());
    }
    System.out.println("线程池已经关闭");*/

    //2
    /*try {
    boolean loop = true;
    do { //等待所有任务完成
    loop = !pool.awaitTermination(3, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
    } while(loop);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } */

    //3
    /*System.out.println("开始等待");
    boolean b = pool.awaitTermination(3, TimeUnit.SECONDS);
    System.out.println("等待完毕");
    if(b){
    System.out.println("分线程已经结束");
    }
    //第一个参数指定的是时间,第二个参数指定的是时间单位(当前是秒)。返回值类型为boolean型。
    //1️⃣如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。输出“分线程已结束”。
    //2️⃣如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。不输出“分线程已结束”。
    //3️⃣如果等待时间没有超过指定时间,等待!*/
  • 相关阅读:
    初来乍到
    OpenGl基础篇(1.0)
    说说结构化方法和面向对象方法
    浅谈软件项目管理
    测试篇
    结构化与面向对象化之应用比较
    敏捷软件开发VS传统软件开发
    SOSO街景地图 API (Javascript)开发教程(1)- 街景
    阿里实习内推面经
    Android工程开发笔记<一>
  • 原文地址:https://www.cnblogs.com/qxqbk/p/11044657.html
Copyright © 2020-2023  润新知