线程池提交execute和submit有什么区别?线程池怎么关闭
  qPDHaeUaDv9Q 2023年11月02日 65 0

一、线程池提交execute和submit有什么区别?

1. execute 用于提交不需要返回值的任务

threadsPool.execute(new Runnable() {
  @Override public void run() {
  // TODO Auto-generated method stub }
});

2. submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个 future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值

Future<Object> future = executor.submit(harReturnValuetask);
try { 
  Object s = future.get(); 
} catch (InterruptedException e) {
	// 处理中断异常
  } catch (ExecutionException e) {
  	// 处理无法执行任务异常
  } finally {
  	// 关闭线程池 executor.shutdown();
}


二、线程池怎么关闭

可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrup方法来中断线程,所以无法响应中断的任务可能永远无法终止。

2.1 shutdown

shutdown()将线程池状态设置为shutdown,并不会立即停止:

1、停止接收外部submit的任务;

2、内部正在跑的任务和队列里等待的任务会执行完

3、等到第二步完成后,才真正停止

2.2 shutdownNow

shutdownNow()将线程池状态置为stop。一般会立即停止,事实不一定:

1、和shutdown()一样,先停止接收外部提交的任务

2、忽略队列里等待的任务

3、尝试将正在跑的任务interrupt中断

4、返回未执行的任务列表

2.3 shutdown和shutdownNow的区别

shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了,这样做立即生效,但是风险也比较大。

shutdown()只是关闭了提交通道,用submit()是无效的;而内部的任务该怎么跑还是怎么跑,跑完再彻底停止线程池。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   28   0   0 ideciciMaxideMax
qPDHaeUaDv9Q