一、资源
1、 一篇线程池的入门级别的demo
http://www.cublog.cn/u2/70285/showart_1936084.html
2、挺详细的,用的是一样的demo
http://blog.csdn.net/waterbig/article/details/4794244
二、分析
看了一些线程和线程池的资料,自己动手看看
前期:
整个代码就改了两个地方
1、为了观察方便
// 便于观察,等待一段时间
System.out.println("thread %s sleep "+Thread.currentThread().getName());
Thread.sleep(produceTaskSleepTime);
2、这条比较有用,对Queue的操作和策略了解很有用
// 处理一个任务,这里的处理方式太简单了,仅仅是一个打印语句
System.out.println("start .." + threadPoolTaskData+"@"+Thread.currentThread().getName());
运行:
基本的一些概念,核心,最大,策略,并行
当前策略: ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.AbortPolicy());
参数:core:2 max:4 workQueue: ArrayBlockingQueue 有界队列,大小为3 策略:抛异常
运行结果:
这里看出:1、2->新建线程,3、4、5入队列,6,7->新建线程,按照策略,8,9,10被拒绝,报错,之后,从队列取出任务,用空闲的线程执行3,4,5.
根据策略的说明,若是 ThreadPoolExecutor.DiscardOldestPolicy,应该是3,4,5被抛弃,而执行8,9,10.运行证实。