new Thread的弊端
a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行.
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行.
newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待.示例代码如下,此示例需要jdk1.8环境(因为
应用到了1.8的新特性lambda表达式)和fastjson的jar包,如果不需要输出,屏蔽掉fastjson相关的操作即可
代码:
package com.qfx.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import com.alibaba.fastjson.JSONObject;
import com.qfx.util.DateUtil;
public class ThreadPoolDemoTwo {
// 总记录数
private static Map getTotalResult() {
Map map = new HashMap();
map.put("totalResult", 8699);
try {
Thread.sleep(2000);
System.err.println("线程[" + Thread.currentThread().getName() + "]执行方法getTotalResult()完毕,本方法执行需要时间2秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
return map;
}
// 记录集合(无参)
private static List