线程NO.9 线程池

Posted 进击的Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程NO.9 线程池相关的知识,希望对你有一定的参考价值。

【线程】NO.9 线程池(一)

图片来自于百度图片

线程池


以上图中的轮渡为例,轮船的个数已定,每天旅游观光的人数不定,人数多就全部出动,人数少,就只需要出动适量的就好了。这个就是我们现实中的线程池。


从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,在工作队列中保存了所有等待执行的任务。在线程池中执行任务比为每一个任务分配一个线程优势更多。通过重用线程来避免线程的大量创建和销毁,同时提高了响应性,避免多个线程竞争资源。


其实要实现一个自定义的线程池很简单,就利用上文讲到的Executor实现一个简单的固定长度线程池,来一个任务创建一个线程。


程序一:自定义固定长度线程池



public class ThreadPool implements Executor{
   AtomicInteger  size = new AtomicInteger(0);
   int count;
   LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(100); //任务队列
   public  ThreadPool(int count) {
       this.count = count;
   }
   @Override
   public void execute(Runnable command) {
       if(size.getAndIncrement() < count) {
           new WorkThread().start();
       }
       try {
           add(command);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }
   public void add(Runnable command) throws InterruptedException {
           blockingQueue.put(command);
   }
   class WorkThread extends Thread{
       public void run() {
           while(true) {
               try {
                   blockingQueue.take().run();;
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
       }
   }
   public static void main(String[] args) {
       ThreadPool tp = new ThreadPool(5);
       for(int i=0;i<2000;i++) {
           final int m = i;
           tp.execute(new Runnable() {
               @Override
               public void run() {
                       System.out.println(Thread.currentThread().getName()+" "+": 执行第"+m+"个任务");
               }
           });
       }
   }
}


利用Executors创建线程池


newFixedThreadPool:创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量(如果某个线程由于发生了未预期的异常而结束,那么线程池将会补充一个新线程)。


newCachedThreadPool:创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程。


newSingleThreadExecutor:单线程的Executor,如哦给这个单线程异常结束,将会新建一个线程来替代。


newScheduledThreadPool:创建一个固定长度的线程池,而且以延迟或者定时的方式来执行任务。


由于使用了线程池,不仅可以避免大量的创建线程的情况,更可以利用Executor实现各种调优、管理、监视、记录日志和错误报告等。


下期提要


下期我们将详细介绍每种线程池的具体使用方法。




以上是关于线程NO.9 线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java——线程池

线程池与并行度

Java线程池详解

Java线程池详解

Java 线程池详解

Motan在服务provider端用于处理request的线程池