一、线程池提交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()是无效的;而内部的任务该怎么跑还是怎么跑,跑完再彻底停止线程池。