java自带的线程池
java提供了一个非常好用的工具类Executors,通过Executors我们可以非常方便的创建出一系列的线程池:
Executors.newCachedThreadPool,根据需要可以创建新线程的线程池。线程池中曾经创建的线程,在完成某个任务后也许会被用来完成另外一项任务。
Executors.newFixedThreadPool(int nThreads) ,创建一个可重用固定线程数的线程池。这个线程池里最多包含nThread个线程。
Executors.newSingleThreadExecutor() ,创建一个使用单个 worker 线程的 Executor。即使任务再多,也只用1个线程完成任务。
Executors.newSingleThreadScheduledExecutor() ,创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期执行。
需要更多Java知识点和面试题的朋友可以点一点下方链接免费领取
链接:1103806531暗号:CSDN
提交给线程池的线程要是可以被中断的
ExecutorService线程池提供了两个很方便的停止线程池中线程的方法,他们是shutdown和shutdownNow。
shutdown不会接受新的任务,但是会等待现有任务执行完毕。而shutdownNow会尝试立马终止现有运行的线程。
那么它是怎么实现的呢?我们看一个ThreadPoolExecutor中的一个实现:
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
} finally {
mainLock.unlock();
}
tryTerminate();
return tasks;
}
里面有一个interruptWorkers()方法的调用,实际上就是去中断当前运行的线程。
所以我们可以得到一个结论,提交到ExecutorService中的任务一定要是可以被中断的,否则shutdownNow方法将会失效。
public void correctSubmit(){
Runnable runnable= ()->{