1.New Thread弊端
我们在执行异步任务的时候,经常new Thread
new Thread(new Runnable() {
public void run() {
System.out.println("do someThing");
}
});
}
这样有许多弊端比如
a.每次 new Thread 新建性能差
b. 线程缺乏统一管理
c.缺乏更多功能,如定时执行,定期执行,线程中断
相比new Thread,Java提供四种线程池的好处
a.可重用存在的线程,减少对象的创建,消亡的开销,性能佳
b.可有效控制最大并发线程数,提高系统资源使用率,同时避免过多资源竞争,避免的堵塞
c.提供定时执行,定期执行,单线程,并发控制等功能。
2.线程池
Java提供Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程;
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出线程会在队列中等待;
newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有任务按照顺序执行
总结来说就是newCachedThreadPool是复用线程;
newFIxedThreadPool是定长线程,可控制并发数量;
newSecheduledThreadPool 定时和周期任务执行;
newSingleThreadExecutor 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
ThreadPoolExecutor默认有四个拒绝策略:
1、ThreadPoolExecutor.AbortPolicy() 直接抛出异常RejectedExecutionException
2、ThreadPoolExecutor.CallerRunsPolicy() 直接调用run方法并且阻塞执行
3、ThreadPoolExecutor.DiscardPolicy() 直接丢弃后来的任务
4、ThreadPoolExecutor.DiscardOldestPolicy() 丢弃在队列中队首的任务
当然可以自己继承RejectedExecutionHandler来写拒绝策略.
参考:
https://blog.csdn.net/u011974987/article/details/51027795