java 线程池
程序员文章站
2022-04-19 13:53:29
...
在分析java线程池源码之前,先对线程池作一个简单的介绍和铺垫。
在开发中,经常有两个与"池"相关的东西出现在我们的视野中:一个是连接池;另一个是线程池。为什么要使用它们呢?我想原因有两个:
1)不管创建一个连接池还是线程池,它们的性能开销还是十分大的;
2)连接的数量有一个边界,不可能来一个就创建一个,启到以有限的资源去处理未知的请求。
总言之,"池"是为了提升系统的性能而设计出来的。
那么在分析线程池之前,我想有几个概念需要理解清楚了。
1.线程任务
这个就是你submit或者execut的具体的线程任务了,即就是你自己定义处理具体逻辑的线程。
2.工作线程(work_thread)
在初始时,需要建立一定数量的线程,这些线程就是工作线程,它的任务就是从等待队列中取出线程来执行。
3.线程等待队列
如果要处理的线程数量大于work_thread的数量,那么有些线程就要进入等待队列中了,当然这样的描述是不全面的,因为在 ThreadPoolExecutor中有各个参数明确的定义。
所以一个简易的线程池的结构如下:
在开发中,经常有两个与"池"相关的东西出现在我们的视野中:一个是连接池;另一个是线程池。为什么要使用它们呢?我想原因有两个:
1)不管创建一个连接池还是线程池,它们的性能开销还是十分大的;
2)连接的数量有一个边界,不可能来一个就创建一个,启到以有限的资源去处理未知的请求。
总言之,"池"是为了提升系统的性能而设计出来的。
那么在分析线程池之前,我想有几个概念需要理解清楚了。
1.线程任务
这个就是你submit或者execut的具体的线程任务了,即就是你自己定义处理具体逻辑的线程。
2.工作线程(work_thread)
在初始时,需要建立一定数量的线程,这些线程就是工作线程,它的任务就是从等待队列中取出线程来执行。
3.线程等待队列
如果要处理的线程数量大于work_thread的数量,那么有些线程就要进入等待队列中了,当然这样的描述是不全面的,因为在 ThreadPoolExecutor中有各个参数明确的定义。
所以一个简易的线程池的结构如下:
//构造函数:初始化工作线程 public ThreadPool(int size){ work_threads=new WorkThread[size]; for(int i=0;i<size;i++){ work_threads[i]=new WorkThread(); } }
//WorkThread的run方法实现 public void run(){ Runnable r=null; while(true){ //线程等待队列为空则等待 if(taskQueue.size()==0){ wait(20); } if((r==taskQueue.get()!=null)){ r.run(); r=null; } } }
//execute方法的实现 public void execute(Runnable r){ taskQueue.add(r); taskQueue.notify(); }
下一篇: 多账户(大于2个)转账死锁问题