1.固定线程池
简析:设置五个线程进行10个任务的调配,五个线程重复五次执行。
ExecutorService poolfixed = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
poolfixed.submit(()->{
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName()+"\t"+j);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
poolfixed.shutdown();
List<Runnable> runnables = poolfixed.shutdownNow();
结果截图:
2.缓存线程池
简析:没有固定的线程,随机进行线程的调度,缺点,无法承载过大的任务量。
ExecutorService poolCache = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
poolCache.submit(()->{
for (int j = 0; j < 5; j++) {
System.out.println(Thread.currentThread().getName()+"\t"+j);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
3.单线程池
简析:只要一个线程进行运作,适合定期检查链接池的对象是否存活这种定期且简单任务
ScheduledExecutorService poolScheduled = Executors.newScheduledThreadPool(5);
4.调度线程池
1.固定节奏,线程之间没有依赖关系。调度第一次,后续以 period 为一个时间周期进行调度,该方法运行时间是固定的耗时,如果某次耗时超过调度周期(period),则下一次调度从上一次任务结束时开始。
poolScheduled.scheduleAtFixedRate(()->{
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},0,10, TimeUnit.SECONDS);
2.固定时间,线程之间有依赖关系,下一个线程时间为上一线程运行时间+period的时间后。
poolScheduled.scheduleWithFixedDelay(()->{
for (int i = 0; i < 8; i++) {
System.out.println(Thread.currentThread().getName()+"\t"+i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},0,10, TimeUnit.SECONDS);
Thread.sleep(30000);
poolScheduled.shutdown();
}
注意:这里要进行主线程的sleep,不然主线程直接关闭。