亲宝软件园·资讯

展开

java 优雅关闭线程池的方案

AnonyStar 人气:0

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

在 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

加载全部内容

相关教程
猜你喜欢
用户评论