码迷,mamicode.com
首页 > 编程语言 > 详细

线程池学习

时间:2019-10-27 23:01:38      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:子线程   sys   学习   mina   线程池   stat   一个   err   适合   

 一般使用Executors类来创建线程池

  1.  简单示例:
 1     public static void main(String[] args) {
 2         Callable myCallable = new Callable() {
 3             @Override
 4             public Object call() throws Exception {
 5                 System.out.println("current Thread name is:"+Thread.currentThread().getName());
 6                 return Thread.currentThread().getName();
 7             }
 8         };
 9         ExecutorService ex = Executors.newFixedThreadPool(3);    //设置线程池拥有三个线程
10         for (int i = 0; i < 10; i++){
11             FutureTask futureTask = new FutureTask(myCallable);    //使用futureTask类可以用来接受子线程执行的返回返回结果
12             ex.submit(()->{
13 
14             });
15         }
16     }

 

  1. 一般我们利用Executorsl类来创建线程池,利用这个类我们一般可以创建下列常见的线程池:
线程池  说明
newFixedThreadPool(int nThreads) 创建指定线程数的线程池
newCacheThreadPool() 1. 适合处理大量短时间工作任务的场景    2.会优先使用空闲的缓存线程,若无则创建新的线程 3. 若空闲线程超过60s,会将空闲线程移除
newSingleThreadExecutor() 创建一个唯一的线程来执行工作任务,若抛出异常会创建一个新的线程来替代
newScheduledThreadPool(int nThreads)和newSingleScheduledExecutor() 定时或周期性的工作调度,两者的区别在于单一线程和多线程
newWorkStealingPool() 内部会构建forkJoinPool,利用woeking-stealing算法,并行的处理任务,不保证顺序

 


     
 
 
  

 

  1.  线程池进一步解析

1. 进一步查看代码,可以看到newFixedThreadPool,newCacheThreadPool,newSingleThreadExecutor其实都是都通过ThreadPoolExecutor()来创建的,只是传入的参数不同,源码如下,需要解释每个参数的含义

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             threadFactory, defaultHandler);
    }
参数| 含义
corePoolSize 核心线程数量
maximumPoolSize 最大线程数量
keepAliveTime 空闲线程存活时间
unit 时间单位
workQueue 任务队列
threadFactory 创建线程的工厂
defaultHandler

|饱和策略:1.AbortPolicy:直接抛出异常(默认)         

              2.CallerRunsPolicy:用调用者所在的线程来执行任务

              3.DiscardOldestPolicy:丢弃队列中最靠前的任务,来执行当前任务

             4.DiscardPolicy:直接丢弃当前任务 5.实现RejectedExecutionHandler接口的自定义handler




 






 

 

 线程池的运行状态

状态 解释
RUNNING 能处理新提交的任务,并且也能处理阻塞队列中的任务
SHUTDOWN 不在接受新提交的任务,但是能够处理存量任务
STOP 不在接受新提交的任务,也不处理存量任务
TIDYING 所有任务已经终止
TERMINATED terminated()方法执行后,进入该状态


 
 
 
 
 

线程池学习

标签:子线程   sys   学习   mina   线程池   stat   一个   err   适合   

原文地址:https://www.cnblogs.com/longshun/p/11749225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!