标签:子线程 sys 学习 mina 线程池 stat 一个 err 适合
一般使用Executors类来创建线程池
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 }
| 线程池 | 说明 |
| newFixedThreadPool(int nThreads) | 创建指定线程数的线程池 |
| newCacheThreadPool() | 1. 适合处理大量短时间工作任务的场景 2.会优先使用空闲的缓存线程,若无则创建新的线程 3. 若空闲线程超过60s,会将空闲线程移除 |
| newSingleThreadExecutor() | 创建一个唯一的线程来执行工作任务,若抛出异常会创建一个新的线程来替代 |
| newScheduledThreadPool(int nThreads)和newSingleScheduledExecutor() | 定时或周期性的工作调度,两者的区别在于单一线程和多线程 |
| newWorkStealingPool() | 内部会构建forkJoinPool,利用woeking-stealing算法,并行的处理任务,不保证顺序 |
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