精华内容
下载资源
问答
  • ExecutorService的几种关闭线程池方法

    千次阅读 2016-03-31 15:48:39
    ExecutorService的几种关闭线程池方法: ExecutorService executorService =Executors.newFixedThreadPool(1); 1、shutdown()方法在终止前允许执行以前提交的任务。 这个方法会顺次地关闭ExecutorService,当...

    ExecutorService的几种关闭线程池方法:


    ExecutorService executorService =Executors.newFixedThreadPool(1);

    1、 shutdown()方法在终止前允许执行以前提交的任务。 这个方法会顺次地关闭ExecutorService,当我们调用这个方法时,ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。

    Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. Invocation has no additional effect if already shut down.

    This method does not wait for previously submitted tasks to complete execution. Use awaitTermination to do that.


     2、 shutdownNow()方法则是阻止正在任务队列中等待任务的启动并试图停止当前正在执行的任务,返回要停止的任务List。

     List<Runnable> shutdownNow();

    Attempts to stop all actively executing tasks, halts the processing of waiting tasks, and returns a list of the tasks that were awaiting execution.

    This method does not wait for actively executing tasks to terminate. Use awaitTermination to do that.

    There are no guarantees beyond best-effort attempts to stop processing actively executing tasks. For example, typical implementations will cancel via Thread.interrupt, so any task that fails to respond to interrupts may never terminate.

    Returns:
    list of tasks that never commenced execution

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

    Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first.

    Parameters:
    timeout the maximum time to wait
    unit the time unit of the timeout argument
    Returns:
    true if this executor terminated and false if the timeout elapsed before termination
    Throws:
    InterruptedException - if interrupted while waiting

    展开全文
  • 2021版Java线程池教程08:关闭线程池shutdown方法 2021版Java线程池08:关闭线程池shutdown方法 视频全集 2021版Java线程池教程 2021版Java多线程教程 代码 Github地址【全部代码】 Task.class ...

    2021版Java线程池教程08:关闭线程池shutdown方法

    2021版Java线程池08:关闭线程池shutdown方法

    视频全集

    代码

    Task.class

    package main;
    
    public class Task implements Runnable {
    
        private final int index;
    
        public Task(int index) {
            this.index = index;
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ":" + index);
        }
    }
    

    Main.class

    package main;
    
    import java.util.concurrent.*;
    
    /**
     * @author 【B站】人人都是程序员
     * @author 【掘金】人人都是程序员
     * @author 【CSDN】人人都是程序员
     * @author 【今日头条】人人都是程序员
     * @author 【官方网站】www.gorhaf.com
     * @author 【微信公众号】gorhaf
     * 欢迎扫描下方二维码关注我们
     * █▀▀▀▀▀▀▀██▀██████▀▀▀▀██▀▀▀▀▀▀▀█
     * █ █▀▀▀█ █▄ ▀ ▄▄█▄█▄█▀██ █▀▀▀█ █
     * █ █   █ █▄▄▀▄▀█▄▄ ██▀ █ █   █ █
     * █ ▀▀▀▀▀ █ █ █▀▄▀▄ █ █ █ ▀▀▀▀▀ █
     * █▀▀▀▀▀█▀▀▀▀▀█ █▀▄▀▀█ ▄▀█▀█▀█▀██
     * █▄▄▄ ██▀█  █▀▀ ▀  ▄ ▄▀▄   ███▄█
     * ██  ▀▀█▀ ▄ ▄ █▀▄▄▄▀▄▀▄ ▄██▀▀▄██
     * █ █▄▄  ▀ █ ▄█▄▄▄▀▄▀█▄ ▄ ▄ █ █▄█
     * █  ▄██▄▀██▄ █ ▀▄▀ ▀▀ ▄▄▄▀██▀▄██
     * █ █▀▀█▀▀█▀ █▀▀█▄▀▀█▀▄ ▀▄    █▄█
     * █ █▀▀██▀▀█▀  █▀▀  ██▄▀▀▀▀▀█▀ ▀█
     * █▀▀▀▀▀▀▀█ ▄██▄▄▀▀▀▄▄▀ █▀█   ▄▄█
     * █ █▀▀▀█ █▀ ▄█ █▀ ▄▀▄▄ ▀▀▀  ▀▀ █
     * █ █   █ █ ▄▀▀▀█▄ ▄▀▄▀ █▀▀▀ ▀ ▄█
     * █ ▀▀▀▀▀ █ ▀█ ▀█▄  █▄█▄▄█  ▄▀▄██
     * ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
     */
    public class Main {
    
        public static void main(String[] args) {
            // 创建线程池
            ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 0L,
                    TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(1),
                    new ThreadPoolExecutor.AbortPolicy());
            try {
                // 提交任务
                threadPool.execute(new Task(1));
                threadPool.execute(new Task(3));
            } catch (RejectedExecutionException e) {
                e.printStackTrace();
            } finally {
                // 关闭线程池
                threadPool.shutdown();
                // 提交任务
                threadPool.execute(new Task(2));
            }
        }
    }
    
    展开全文
  • 优雅关闭线程池

    2021-06-07 09:57:09
    这一类的文章在公众号其实是很多的,所以这一篇主要是加深自己对线程池的相关函数以及关闭线程池的知识点进行总结~ why? 为啥会出现如何优雅关闭线程池这类问题?比如说线程池还在执行任务,这时jvm就关闭了,很多...

    前言

    这一类的文章在公众号其实是很多的,所以这一篇主要是加深自己对线程池的相关函数以及关闭线程池的知识点进行总结~

    why?

    为啥会出现如何优雅关闭线程池这类问题?比如说线程池还在执行任务,这时jvm就关闭了,很多任务是直接out对吧。所以说如何解决这个问题。

    how?

    RunTime.getRunTime().addShutdownHook

    新增一个关闭回调钩子,就是在jvm关闭的时候会进行回调。

    其次,如果是你去完成关闭线程池的功能你会怎么设计呢

    PS:之前面阿里的时候,有个小组leader说我还有一些细节的东西没有了解全面,但是…很多东西原理都是互通的,比如说网关,nginx转发等等,跟gateway还有dubbo转发原理是一样的,正所谓大道至简~

    那我们设计的话:

    1. 超时关闭,这个等待时间是没有人知道的,像接口超时有些固定5秒,10秒,20秒
    2. 会记录下丢失的任务线程id
    3. 打印相关的日志

    相关参数

    这里以ExecutorService为例

    shutdowm

    在这里插入图片描述
    启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。 此方法不等待先前提交的任务完成执行。使用 awaitTermination 来做到这一点。

    shutdownNow
    在这里插入图片描述
    尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。 此方法不会等待主动执行的任务终止。使用 awaitTermination 来做到这一点。 除了尽力尝试停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何未能响应中断的任务可能永远不会终止。 返回: 从未开始执行的任务列表

    所以这个方法是可以返回未开始执行的任务列表,也就是打印相关还未执行的线程。

    shutdown跟shutdownNow区别

    shutdownNow会主动去尝试终止正在进行的任务,而shutdown只是不再接受新的任务

    具体关闭线程池代码

    The following method shuts down an ExecutorService in two phases, first by calling shutdown to reject incoming tasks, and then calling shutdownNow, if necessary, to cancel any lingering tasks:
     void shutdownAndAwaitTermination(ExecutorService pool) {
       pool.shutdown(); // Disable new tasks from being submitted
       try {
         // Wait a while for existing tasks to terminate
         if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
           pool.shutdownNow(); // Cancel currently executing tasks
           // Wait a while for tasks to respond to being cancelled
           if (!pool.awaitTermination(60, TimeUnit.SECONDS))
               System.err.println("Pool did not terminate");
         }
       } catch (InterruptedException ie) {
         // (Re-)Cancel if current thread also interrupted
         pool.shutdownNow();
         // Preserve interrupt status
         Thread.currentThread().interrupt();
       }
     }
     
    

    当然这只是个demo,如果你觉得像接口重试,或者连接超时那样,只要超过特定时间就抛出异常,也可以,等待完直接shutdownNow,会有点暴力。

    参考资料

    展开全文
  • 线程池的拒绝策略 java中断线程方式 ExecutorService对象的shutdown()和shutdownNow()的区别? shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdown...

    目录

    ExecutorService对象的shutdown()和shutdownNow()的区别?

    线程池的拒绝策略

    java中断线程方式


    ExecutorService对象的shutdown()和shutdownNow()的区别?

    shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。

    线程池的拒绝策略

     ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

    ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

    ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

    ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

     线程池中默认的拒绝策略:ThreadPoolExecutor.AbortPolicy。

    java中断线程方式

    方式一:stop()方法

    该方法在目前JDK版本标记为过时的方法,该方法线程不安全,调用该方法线程立即停止,可能导致部分线程逻辑未执行。

    方法二:使用interrupt()中断线程

    interrupt()方法并不像在for循环语句中使用break 语句那样干脆,马上就停止循环。调用interrupt ()方法仅仅在当前线程中打一个停止的标志,并不是真的停止线程。

    当调用interrupt()方法中断线程时,中断线程并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。这一点很重要,如果中断后,线程立即无条件退出,那么我们又会遇到stop()方法的老问题。

    要停止线程的话,需要用到Thread.isInterrupted()和Thread.interrupted()方法

    Thread.isInterrupted() 判断是否中断。

    Thread.interrupted() 判断是否被中断,并清除当前中断状态。

    3、使用标志位停止线程

        //volatile 修饰符用来保证其他线程读取的总是该变量的最新的值
        public volatile boolean exit=false;
    
        @SneakyThrows
        @Override
        public void run(){
            ServerSocket serverThread=new ServerSocket(8080);
            while (!exit){
                serverThread.accept();//阻塞等待客户端消息
            }
        }
    
        public static void main(String[] args){
            ServerThread t=new ServerThread();
            t.start();
            t.exit=true;//修改标志位,退出线程
        }

     

    展开全文
  • 前言 相信大家在面试的时候经常会遇到「线程池」相关的问题,比如: ...如上这些问题,如果看过线程池源码的小伙伴,基本就能回答上来了,即便是看面试题也能说上个一二,但是当真的问你,如何关闭线程池?你能
  • 首先了解下ExecutorService接口中涉及线程池关闭的几个方法: /** *这个方法是一种安全关闭线程池方法,调用这个方法后, *线程池会根据拒绝策略来拒绝新提交的任务, *然后线程池会把正在执行的任务,和在...
  • 1.1 创建线程池,构造方法的几个参数说明及创建如下。 1.2 shutdown方式关闭线程池 a. 空闲且能interrupt表示该线程处于阻塞等待状态,不包括工作中的阻塞状态,比如Thread.sleep()就不包括;b. 当前正在工作...
  • 今天在项目中使用了线程池,发现不会把线程关闭掉,...shutdown()方法关闭线程池,这个方法会等待正在运行和队列里的任务都执行完毕后,才会关闭线程池。 isTerminated()每次调用此方法都会返回一个boolean值,...
  • 如何优雅的关闭线程池? 其实在java源代码注释里有:大致是先调用shutdown方法,然后再调用awaitTermination等待正在执行的任务的结束。如果在一段时间内仍未结束,再调用shutdownnow方法强制停止。 guava的线程池...
  • java优雅地关闭线程池

    2020-03-02 16:59:49
    根据ExecutorService JavaDoc中的示例方法优雅地关闭线程池并了解其中的工作原理,不深入探究。 /** * 优雅关闭线程池 * 按照ExecutorService JavaDoc示例代码编写的Graceful Shutdown方法. * 先使用shutdown, ...
  • 如何正确的关闭线程池

    万次阅读 2019-07-30 15:31:46
    首先看源码中的一句注释: A pool that is no longer ...如果程序中不再持有线程池的引用,并且线程池中没有线程时,线程池将会自动关闭线程池自动关闭的两个条件:1、线程池的引用不可达;2、线程池中没有...
  • 如何优雅的关闭线程池

    千次阅读 2018-07-08 13:57:25
    JUC中可以通过Executors框架来实现线程池,可以创建一个固定大小的线程池...关闭线程池有两种方法:shutdown()和shutdownNow(),两种方法的区别何在?1.shutdown()当调用了shutdown()方法时,便进入关闭状态,此时意...
  • 优雅的关闭线程池

    2021-03-02 21:56:10
    有运行任务自然也有关闭任务,从上文提到的 5 个状态就能看出如何来关闭线程池。 其实无非就是两个方法shutdown()/shutdownNow()。 但他们有着重要的区别: shutdown()执行后停止接受新任务,会把队列的任务执行...
  • 用于关闭线程池方法之一。简单来说,会等任务都完成后在关闭线程池。 public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); //全局锁 try { //查看调用shutdown的...
  • 关闭线程池 shutdown 和 shutdownNow 的区别 文章目录关闭线程池 shutdown 和 shutdownNow 的区别前言项目环境1.线程池示例2.shutdown3.isShutdown4.isTerminated5.awaitTermination6.shutdownNow7.shutdown 和 ...
  • 一、线程池 execute 方法源码解析、 二、线程池 execute 方法完整源码及注释
  • 再谈线程池——友好地关闭线程池

    千次阅读 2015-09-21 11:15:40
    线程池关闭与退出
  • 我们经常在项目中使用的线程池,但是是否关心过线程池关闭呢,可能很多时候直接再...在 Java 中和关闭线程池相关的方法主要有如下: void shutdown() List<Runnable> shutDownNow boolean awaitTerminat..
  • 深入浅出多线程编程实战(八)优雅关闭线程池

    千次阅读 多人点赞 2021-05-25 14:44:07
    文章目录前言一、关闭线程池方法1.ShutDown2.ShutDownNow3.awaitTermination4.isShutDown5.isTerminated结尾 前言 我们经常在项目中使用的线程池,但是是否关心过线程池关闭呢,可能很多时候直接再项目中直接...
  • 3.10 使用线程池时候当程序结束时候记得调用shutdown关闭线程池日常开发中为了便于线程的有效复用,线程池是经常会被用的工具,然而线程池使用完后如果不调用shutdown会导致线程池资源一直不会被释放。下面通过简单...
  • java线程池关闭线程池中的线程

    千次阅读 2016-04-20 23:53:35
    当然放倒线程池里的东西就随他而去吧,你就不要去尝试关闭了,如果想去关闭的话,还是老老实实的new吧~newCachedThreadPool 这个一个带缓存的线程池,是个可以无限大的线程池,新建的线程放倒这个池子里,当线程停...
  • 一、使用线程池时候当程序结束时候记得调用shutdown关闭线程池 日常开发中为了便于线程的有效复用,线程池是经常会被用的工具,然而线程池使用完后如果不调用shutdown会导致线程池资源一直不会被释放。下面通过简单...
  • 优雅停机关闭线程池

    2020-05-12 20:00:28
    出自rocketmq源码NamesrvStartup.start方法 ... * 在JVM进程关闭之前,先将线程池关闭,及时释放资源) */ Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void&g
  • 关闭线程池shutdownNow()方法的局限性

    千次阅读 2018-03-07 16:05:14
    shutdownNow只返回任务队列中尚未开始的任务列表,但是想要记录那些已经开始但被取消的任务,可以使用条件检查:线程池的状态处于关闭中且任务的状态为已中断(当然前提是任务要保持中断状态)。之前对中断有点误解....
  • 对于一些定时任务或者网络请求服务将会使用线程池,当应用停机时需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题。 关闭线程池我们可以选择什么都不做,JVM 关闭时自然的会...
  • 优雅地关闭线程池

    2019-12-22 11:59:38
    由于在应用关闭的时候异步任务还在执行,导致类似数据库连接池这样的对象一并被销毁了,当异步任务中对数据库进行操作就会出错。 解决方案如下,重新设置线程池配置对象,新增线程池...
  • 1,newFixedThreadPool(int nThreads) 创建一个重复利用一定数目线程的线程池。在任何时候,最多只能有nThreads个线程运行。当全部的线程都在运行,...这个线程池会一直存在,除非关闭 2,newWorkStealingPool(i
  • 在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。...在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。
  • 知识储备 - 线程池的5种状态 1. RUNNING 状态说明: 线程池处于RUNNING状态时,能够接收新的任务,并对已经...状态切换: 调用线程池的shutdown()方法后,线程池的状态RUNNING -> SHUTDOWN 3. STOP 状态说明: 线

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,967
精华内容 39,586
关键字:

关闭线程池的方法