线程池

Posted 意犹未尽

tags:

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

通过Executor创建线程池

Executor.newFixedTreadPool 

 public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

内部通过new ThreadPoolExecutor创建线程池

返回一个固定数量的线程池。如果线程池中有空闲线程则直接交给空闲线程执行。如果没有将任务放到队列

 

Executor.newSingleThreadExecutor 

 public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

 

返回一个线程的线程池,如有空闲则执行,没有则将任务放到队列中等待

Executor.newCachedTreadPool 

 public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

 

返回一个根据实际情况调整线程个数的线程池塘 不限制最大线程数,如果有空闲线程则直接交给空线程执行 没有则创建,线程空闲超过60秒则指定回收

Exucutor.newScheduledThreadPool 

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }


  public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
public class ScheduledThreadPoolExecutor
        extends ThreadPoolExecutor
        implements ScheduledExecutorService

可以发现还是通过ThreaPoolExecutor实现 队列使用DeayedWorkQueue

返回SchededExecutoryService对象

可以实现定时任务

 public static void main(String[] args) throws InterruptedException {
       ScheduledExecutorService scheduledExecutorService= Executors.newScheduledThreadPool(1);
       scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
           @Override
           public void run() {
               System.out.println("11");
           }
       },1,3,TimeUnit.SECONDS);
      // 1为延迟多久执行  3为轮训时间  TimeUnit.seconds为 时间单位
    }

 

自定义线程池

ThreadPoolExecutor的构造函数
 public ThreadPoolExecutor(int corePoolSize,//核心线程数量 (默认线程数量)
                              int maximumPoolSize,//最大线程数量(如果没有超过最大线程数量 没有空闲线程则创建)
                              long keepAliveTime,//线程的生命周期
                              TimeUnit unit,//keepAliveTime时间单位
                              BlockingQueue<Runnable> workQueue,//若没有空闲线程 任务放置的队列
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)//队列有有界队列。如果任务队列满了以后。拒绝的任务的自定义操作

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

Java——线程池

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

Java线程池详解

Java线程池详解

Java 线程池详解

线程池-实现一个取消选项