目录
2.1、newSingleThreadExecutor:创建单个线程的线程池
2.2、newFixedThreadPool:创建一个固定大小的线程池
2.3 newCachedThreadPool:带缓存的线程池,适用于短时间有大量任务的场景,但有可能会占用更多的资源;线程数量随任务量而定。
2.4 newSingleThreadScheduledExecutor:创建执行定时任务的单个线程的线程池
2.5 newScheduledThreadPool:创建执行定时任务的线程池
2.6 newWorkStealingPool:根据当前设备的配置自动生成线程池
1、线程池的创建分两种
- 通过Executors自动创建
- 通过ThreadPoolExecutor手动创建
2、Executors创建线程池的6种方法
2.1、newSingleThreadExecutor:创建单个线程的线程池
ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
for(int i = 0; i < 5; i++){
singleExecutor.submit(()->{
System.out.println(Thread.currentThread().getName() + "---");
});
}
singleExecutor.shutdown();//当线程任务执行完毕后,释放资源
结果:
可以看到仅有一个线程在执行。
2.2、newFixedThreadPool:创建一个固定大小的线程池
ExecutorService singleExecutor = Executors.newFixedThreadPool(4);//创建4个固定长度的线程池
for(int i = 0; i < 5; i++){
singleExecutor.submit(()->{
System.out.println(Thread.currentThread().getName() + "---");
});
}
singleExecutor.shutdown();//当线程任务执行完毕后,释放资源
结果:
可以看到创建了4个线程来执行任务。
2.3 newCachedThreadPool:带缓存的线程池,适用于短时间有大量任务的场景,但有可能会占用更多的资源;线程数量随任务量而定。
ExecutorService singleExecutor = Executors.newCachedThreadPool();
for(int i = 0; i < 50; i++){
singleExecutor.submit(()->{
System.out.println(Thread.currentThread().getName() + "---");
});
}
singleExecutor.shutdown();//当线程任务执行完毕后,释放资源
结果:
可以看到50个任务仅创建了16个线程来处理。
2.4 newSingleThreadScheduledExecutor:创建执行定时任务的单个线程的线程池
ScheduledExecutorService service= Executors.newSingleThreadScheduledExecutor();
System.out.println("添加任务:"+ LocalDateTime.now());
service.schedule(new Runnable() {
@Override
public void run() {
System.out.println("执行任务:"+LocalDateTime.now());
}
},3,TimeUnit.SECONDS);//推迟3秒执行任务
结果:时间相差 3s
2.5 newScheduledThreadPool:创建执行定时任务的线程池
ScheduledExecutorService singleExecutor = Executors.newScheduledThreadPool(3);
long cur = System.currentTimeMillis()/1000;
System.out.println(System.currentTimeMillis()/1000 - cur);
for(int i = 0; i < 10; i++){
singleExecutor.schedule(()->{
System.out.println(System.currentTimeMillis()/1000 - cur);
System.out.println(Thread.currentThread().getName()+"----");
}, 3, TimeUnit.SECONDS);
}
singleExecutor.shutdown();//当线程任务执行完毕后,释放资源
结果:
可以看出延迟3s执行
2.6 newWorkStealingPool:根据当前设备的配置自动生成线程池
ExecutorService singleExecutor = Executors.newWorkStealingPool();
long cur = System.currentTimeMillis()/1000;
for(int i = 0; i < 10; i++){
singleExecutor.submit(()->{
System.out.println(Thread.currentThread().getName()+"----");
});
}
singleExecutor.shutdown();//当线程任务执行完毕后,释放资源
结果:
根据自身电脑配置决定创建的线程数目
2.7 ThreadPoolExecutor手动创建线程池
创建一个延迟执行线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
3,
2,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3));
for(int i = 0;i < 6; i++){
threadPoolExecutor.submit(()->{
System.out.println(Thread.currentThread().getName()+"----");
});
}
threadPoolExecutor.shutdown();