java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java 关闭线程池

java 优雅关闭线程池的方案

作者:AnonyStar

这篇文章主要介绍了java 优雅关闭线程池的方案,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去关闭,这其实是存在非常大的风险的,大量的线程常驻在后台对系统资源的占用是巨大的 ,甚至引发异常。所以在我们平时使用线程池时需要注意优雅的关闭,这样可以保证资源的管控。

在 Java 中和关闭线程池相关的方法主要有如下:

对于这些方法有着不同的使用和作用,下面我们真的会这些不同的方法做详细的介绍。

ShutDown

shutDown 方法从字面意思我们可以看到是停止关闭的意思,我们先来看下面的一段代码,首先我们通过 ThreadPoolExecutor 来创建一个容量是10的无界线程池,与 FixedThreadPool 类似的,这里手动创建可以更好地理解线程池的创建。在后我们提交一千个任务执行,再执行 shutdown 方法进行暂停。

 public static void main(String[] args) throws InterruptedException {

  ExecutorService service = new ThreadPoolExecutor(
    10,
    10,
    0L,
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>());

  for (int i = 0; i < 1000; i++) {
   service.submit(() ->{
    try {
     TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
     System.out.println("接受中断,不处理~~");
    }
    System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
   });
  }

  service.shutdown();
 }

ShutDownNow

这个方法与上面方法相比较,直观就是 now ,即立即停止任务,
同样是上述案列,略作修改如下,

public static void main(String[] args) throws InterruptedException {

  ExecutorService service = new ThreadPoolExecutor(
    10,
    10,
    0L,
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<>(1000));

  for (int i = 0; i < 1000; i++) {
   service.submit(() ->{
    try {
     TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
     System.out.println("接受中断,结束线程~~");
     //这里响应中断
     return;
    }
    System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName());
   });
  }

  final List<Runnable> runnables = service.shutdownNow();
  System.out.println(runnables);
 }

awaitTermination

boolean awaitTermination_(long timeout, TimeUnit unit)_

isShutDown

isTerminated

作者:AnonyStar

原文链接:https://www.cnblogs.com/i-code/p/14024845.html

以上就是java 优雅关闭线程池的方案的详细内容,更多关于Java 关闭线程池的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文