常用线程池ThreadPoolExecutor类 和 线程池工厂类Executors。在1.5JDK 版本就提供了Executor,用来提供线程池。 可以使用 工厂类 Executors 工具类来创建线程池。一般通过ThreadPoolExecutor 来完成线程池的使用。 在 阿里巴巴的编码规范和其他的文章中,都推荐使用 工具类 Executors 来对 ThreadPooExecutor 进行实例化,而不建议开发者直接对 ThreadPoolExecutor 进行实例化。
一、使用场景很多,最近我在做附件上传接口,由于和其他公司合作,接口提供单个附件上传,如果正常一个上传附件很慢。如果用线程直接调用,由于功能硬件资源有限,导致服务不支持太多线程同时调用,所以用了线程池,且子线程调用完后我有操作,所以写了一个测试实例。
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
//ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10));
for (int k = 0, ksjze = 999; k < ksjze; k++) {
final int currentThreadNum = k;
Runnable run = new Runnable() {
@Override
public void run() {
try {
//执行方法
//do
logger.info("子线程[" + currentThreadNum + "]开始执行");
} catch (Exception e) {
e.printStackTrace();
} finally {
logger.info("子线程[" + currentThreadNum + "]结束");
}
}
};
executor.execute(run);
}
logger.info("已经开启所有的子线程");
executor.shutdown();
logger.info("shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。");
while (true) {
if (executor.isTerminated()) {
logger.info("所有的子线程都结束了!");
//你还可以继续做你的事哟
break;
}
}
}