1.newSingleThreadExcutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadExectutor {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for(int i=0;i<1000000;i++){
executorService.execute(new Task());
}
}
}
class Task implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
源码分析:
创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。同时该执行程序使用单个工作线程进行操作不受限制的队列(因为使用无界队列LinkedBlockingQueue)。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
2.newCachedThreadPool
public class CacheThreadPool {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0;i<100;i++){
executorService.execute(new Task());
}
}
}
上图显示没有创建一百个线程,最多创建了36个线程。因为如果执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
源码分析:
官方解释,创建一个线程池,该线程池根据需要创建新线程,但是将重用先前构造的线程因为这些池通常可以提高性能。如果没有可用的现有线程,则新建一个
线程将被创建并添加到池中。具有的线程六十秒内未使用被终止并从中移除缓存。因此,闲置足够长时间的池将不消耗任何资源。如下图:
3.newScheduledThreadPool
public class ScheduledThreadPoolTest {
public static void main(String[] args) {
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(4);
threadPool.schedule(new Task(),3, TimeUnit.SECONDS);
}
}
表示延迟3秒执行。
源码分析:
根据corePoolSize 参数创建起始线程数目,即使如果它们空闲,也保留在池中的线程数,除非设置了{@code allowCoreThreadTimeOut}。
总结: