Java多线程之彻底搞懂线程池
什么是线程池
线程池是一种线程管理技术,它包括一些线程,等待着需要执行的任务。当一个任务到来时,得到一个线程池中的空闲线程来处理该任务,这些线程被称为工作线程。当任务执行完毕,工作线程并不会被销毁,而是被放回线程池中等待下一个任务的到来。
Java中的线程池
Java提供了一个线程池框架——java.util.concurrent.ThreadPoolExecutor
,使用它可以轻松地创建一个线程池。
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
ThreadPoolExecutor 的构造方法接收五个参数,它们分别是:
corePoolSize
:线程池的核心线程数,就是线程池中长期驻留的线程数。maximumPoolSize
:线程池中允许存在的最大线程数。keepAliveTime
:当线程池中的线程数大于corePoolSize时,多余的空闲线程存活的最长时间。TimeUnit
:时间单位。workQueue
:任务队列,用于存放等待执行的任务。
示例1:使用线程池执行任务
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
final int j = i;
executorService.execute(() -> {
System.out.println("执行任务" + j + ",线程名为:" + Thread.currentThread().getName());
});
}
executorService.shutdown();
}
上面的代码创建了一个固定大小为5的线程池,然后往线程池中添加10个任务,并通过execute()
方法提交任务执行。最后调用shutdown()
方法,关闭线程池。
示例2:自定义线程池
public static void main(String[] args) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 6, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
for (int i = 0; i < 10; i++) {
final int j = i;
threadPool.execute(() -> {
Thread.currentThread().setName("我是线程" + j);
System.out.println(Thread.currentThread().getName() + "执行了任务" + j);
});
}
threadPool.shutdown();
}
上面的代码自定义了一个线程池,核心线程数为3,最大线程数为6,任务队列大小为3,线程名通过设置ThreadFactory来修改。当线程池中的线程数达到最大值,且任务队列满时,采用了AbortPolicy拒绝策略。最后执行10个任务,输出执行任务的线程名和任务编号,最后关闭线程池。
线程池的优势
- 降低资源消耗:重复利用已经创建的线程,降低线程创建和销毁的消耗。
- 提高响应速度:任务来了就直接用已有的线程处理,响应速度快。
- 提高线程可管理性:可以有效地分配、调优线程数量和参数,排除线程死锁等问题。
- 提高代码的稳定性:使用线程池能够稳定地处理请求,减少了线程因为无限制的创建导致系统奔溃风险。
以上就是Java多线程之彻底搞懂线程池的攻略,对于使用线程池这一技术的开发者来说,深入理解并掌握线程池的使用与优化显得尤为重要。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程之彻底搞懂线程池 - Python技术站