1.固定线程池
创建一个线程池,里边放三个线程,创建十个任务,让三个线程谁有空闲谁去执行这十个任务,直到任务结束。
public class ThreadPoolStudy {
public static void main(String[] args) {
//创建一个装有三个线程的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for(int i = 1;i < 11;i++){
final int task = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
for(int j = 1;j < 6;j++){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("当前的线程是:"+Thread.currentThread().getName()+"正在进行第"+j+"次循环,正在执行任务:"+task);
}
}
});
}
}
}
线程池里的三个进程每次从排队队列中取三个任务执行,直到执行完毕,再去等候队列中取三个任务,执行。。。。。
运行结果:
2.threadPool.shutdown()和threadPool.shutdownNow()的区别
shutdown只是将线程池的状态设置为SHUTWDOWN状态,正在执行的任务会继续执行下去,没有被执行的则中断。而shutdownNow则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。
举个工人吃包子的例子,一个厂的工人(Workers)正在吃包子(可以理解为任务),假如接到shutdown的命令,那么这个厂的工人们则会把手头上的包子给吃完,没有拿到手里的笼子里面的包子则不能吃!而如果接到shutdownNow的命令以后呢,这些工人们立刻停止吃包子,会把手头上没吃完的包子放下,更别提笼子里的包子了。
参考地址:https://blog.csdn.net/horero/article/details/77622951
3.缓存线程池的使用
//创建缓存线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
运行结果:
如果来十个任务,开启十个线程去执行,做完任务,过一段时间释放掉;
4.创建单一线程池(如何实现线程死掉重新启动)
ExecutorService threadPool = Executors.newSingleThreadExecutor();
里面只创建一个线程,如果线程死掉了,再创建一个新的线程替补它的工作
5.线程池定时器
创建一个爆破任务,5s后爆炸。
代码实例:
ScheduledExecutorService bombTaskThreadPool = Executors.newScheduledThreadPool(3);
bombTaskThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("炸弹爆炸。。。。。");
}
}, 5, TimeUnit.SECONDS);
第一次在5s钟以后炸,以后每2s炸一次
ScheduledExecutorService bombTaskThreadPool = Executors.newScheduledThreadPool(3);
bombTaskThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("炸弹爆炸。。。。。");
}
}, 5,2, TimeUnit.SECONDS);