import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool_1 {
/**
* @param args
*/
public static void main(String[] args) {
// 创建线程池
// ExecutorService exec = Executors.newFixedThreadPool(3);
//改线程池的缓冲队列的长度为3,初始的最小线程数为2个线程,最大的线程数为3
//当任务进入线程池执行时候:
//当只有2个任务时,线程池中的初始的2个线程就可以搞定,不需要排队和创建新的线程。
//当任务数为5时,线程池中的初始的2个线程做2个任务,3个任务在队列中排队。
//当任务数为6时,线程池中的初始的2个线程做2个任务,3个任务在队列中排队。还有 1个线程,由线程池创建一个新的线程来执行该任务。
//当线程数大于6时,线程池会丢掉其他的任务。(当然可以使用一些策略来对多的任务进行处理AbortPolicy,CallerRunsPolicy,DiscardPolicy, DiscardOldestPolicy)
//handler有四个选择:
//ThreadPoolExecutor.AbortPolicy()
//抛出java.util.concurrent.RejectedExecutionException异常
//ThreadPoolExecutor.CallerRunsPolicy()
//重试添加当前的任务,他会自动重复调用execute()方法
//ThreadPoolExecutor.DiscardOldestPolicy()
//抛弃旧的任务
//ThreadPoolExecutor.DiscardPolicy()
//抛弃当前的任务
//以上情况是任务来的很快,线程池中的线程还没有来得急做完任务。如果任务来的比较慢,线程做事情比较快,任务大于6个的话,理论上也是有可能全部做完,不丢失。
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(3));
// 建立6个线程(可以理解为6个任务)
for (int index = 0; index < 6; index++) {
String task = "task@ " + index;
System.out.println("put " + task);
exec.execute(new ThreadPoolTask(task));
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
// 关闭
exec.shutdown();
}
public static class ThreadPoolTask implements Runnable, Serializable {
private static final long serialVersionUID = 0;
// 保存任务所需要的数据
private Object threadPoolTaskData;
ThreadPoolTask(Object tasks) {
this.threadPoolTaskData = tasks;
}
public void run() {
// 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
System.out.println("start .." + threadPoolTaskData);
try {
// // 便于观察,等待一段时间
// Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
threadPoolTaskData = null;
}
}
}