package com.yiing.study.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* java.util.concurrent中的执行器(Exzcutor)管理Thread类
* @author Administrator
*
*/
public class CachedThreadPool {
public static void main(String[] args){
/**
* 这里调用的是CachedThreadPool将为每个任务都创建一个线程
* 通常会创建与所需数量相同的线程,然后在它回收旧线程时停止创建新线程
*
* FixedThreadPool
* 还可以使用Executor.newFixedThreadPool(5),使用了有限的线程集来执行所提交的任务
* 可以限制线程的数量,不用为每个任务都固定的付出创建线程的开销,在事件驱动的系统中,需要线程的时间处理器,
* 通过直接从池中获取线程,也可以尽快的获取到服务
*
* SingleThreadExecutor
* 会序列化所有提交给它的线程
* 每个任务都会在下一个任务开始之前运行结束,所有的任务使用相同的线程
*/
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i<5; i++){
exec.execute(new LiftOff());
}
/**
*shutdown()方法的调用可以防止新任务被提交给这个Executor,当前线程(本例中位main()线程)将继续运行在shutdown()被
*调用之前提交的所有任务。
*我的理解:Executor是用来创建和管理系统中的所有任务的,所以当有很多个线程的时候,必须要等所有的线程都运行完了,
*Executor才能够被关闭;
*举个例子:
*当我们坐公交车的时候,乘客可以随时上车和下车,但是公交车司机必须要等所有的乘客都下车了以后,才能够停车下班。
*/
exec.shutdown();
System.out.println("Shut down");
}
}
/**
*运行结果
Shut down
#0(9),
#2(9),
#3(9),
#4(9),
#0(8),
#2(8),
#3(8),
#4(8),
#0(7),
#2(7),
#3(7),
#4(7),
#0(6),
#2(6),
#3(6),
#4(6),
#0(5),
#2(5),
#3(5),
#4(5),
#0(4),
#2(4),
#3(4),
#4(4),
#0(3),
#2(3),
#3(3),
#4(3),
#0(2),
#1(9),
#3(2),
#2(2),
#4(2),
#0(1),
#2(1),
#0(LiftOff),
#1(8),
#2(LiftOff),
#4(1),
#3(1),
#4(LiftOff),
#1(7),
#1(6),
#3(LiftOff),
#1(5),
#1(4),
#1(3),
#1(2),
#1(1),
#1(LiftOff),
*/