打字猴:1.700450687e+09
1700450687
1700450688 while(count.get()==0)
1700450689
1700450690 notEmpty.await();
1700450691
1700450692 //等待状态结束,弹出头元素
1700450693
1700450694 x=extract();
1700450695
1700450696 //如果队列数量还多于1个,唤醒其他线程
1700450697
1700450698 if(c>1)
1700450699
1700450700 }
1700450701
1700450702 notEmpty.signal();
1700450703
1700450704 //返回头元素
1700450705
1700450706 return x;
1700450707
1700450708 }
1700450709
1700450710 分析到这里,我们就明白了线程池的创建过程:创建一个阻塞队列以容纳任务,在第一次执行任务时创建足够多的线程(不超过许可线程数),并处理任务,之后每个工作线程自行从任务队列中获得任务,直到任务队列中的任务数量为0为止,此时,线程将处于等待状态,一旦有任务再加入到队列中,即唤醒工作线程进行处理,实现线程的可复用性。
1700450711
1700450712 使用线程池减少的是线程的创建和销毁时间,这对于多线程应用来说非常有帮助,比如我们最常用的Servlet容器,每次请求处理的都是一个线程,如果不采用线程池技术,每次请求都会重新创建一个线程,这会导致系统的性能负荷加大,响应效率下降,降低了系统的友好性。
1700450713
1700450714
1700450715
1700450716
1700450717 编写高质量代码:改善Java程序的151个建议 [:1700438201]
1700450718 编写高质量代码:改善Java程序的151个建议 建议126:适时选择不同的线程池来实现
1700450719
1700450720 Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和Scheduled-ThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供了一个Executors的静态类,它可以直接生成多种不同的线程池执行器,比如单线程执行器、带缓冲功能的执行器等,但归根结底还是使ThreadPoolExecutor类或ScheduledThreadPoolExecutor类的封装类。
1700450721
1700450722 为了理解这些执行器,我们首先来ThreadPoolExecutor类,其中它复杂的构造函数可以很好解释该线程池的作用,代码如下:
1700450723
1700450724 public class ThreadPoolExecutor extends AbstractExecutorService{
1700450725
1700450726 //最完整的构造函数
1700450727
1700450728 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long
1700450729
1700450730 keep Alive Time, Time Unitunit, Block in gQueue<Runnable>
1700450731
1700450732 workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler){
1700450733
1700450734 //检验输入条件
1700450735
1700450736 if(corePoolSize<0||maximumPoolSize<=0||
[ 上一页 ]  [ :1.700450687e+09 ]  [ 下一页 ]