下面就来详细讲解「Java 线程池」的攻略。
线程池概述
线程池是一种多线程处理方式,它可以有效地减少线程创建和销毁过程中的性能开销,提高程序的性能和响应速度。常见的线程池有 FixedThreadPool
、CachedThreadPool
、ScheduledThreadPool
、SingleThreadPool
等。
Java 线程池的实现
Java 线程池的实现是通过 ThreadPoolExecutor
类来实现的,其中 ThreadPoolExecutor
类是 ExecutorService
接口的一个实现类,并且提供了很多可调用的属性来实现对线程池的控制。
常见的线程池类型
常用的线程池类型有四种:
- FixedThreadPool
: 创建固定数量的线程池,当线程池满员时,新任务将被放在队列中。
- CachedThreadPool
: 如果当前可用线程池不够,则创建新的线程池,当有可用的线程池时,将重用线程池;如果超过了 60 秒没有使用,则会关闭该线程池。
- SingleThreadPool
: 只创建一个单线程的线程池,所有任务都在该线程池中排队依次执行。
- ScheduledThreadPool
: 创建同时执行的定时任务。
线程池的常用配置
- corePoolSize:线程池的核心线程数。
- maximumPoolSize:线程池允许的最大线程数。
- keepAliveTime:非核心线程的闲置超时时间。
- unit: keepAliveTime 参数的时间单位。
- workQueue:用于缓存任务的工作队列。
- threadFactory:用于创建线程的工厂。
示例一
下面是一个使用 FixedThreadPool
的示例代码:
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 10; i++) {
final int taskID = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行任务:" + taskID);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "任务:" + taskID + "执行完毕");
}
});
}
executorService.shutdown();
在该示例中,创建了一个核心线程数为 3 的线程池,并提交了 10 个任务。由于线程池的核心线程数为 3,所以在同一时间只会有 3 个任务在执行,其余任务会在工作队列中等待。并且由于工作队列的大小没有指定,实际上使用的是默认的线程池队列 LinkedBlockingQueue
。
示例二
下面是一个使用 CachedThreadPool
的示例代码:
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 1; i <= 10; i++) {
final int taskID = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始执行任务:" + taskID);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "任务:" + taskID + "执行完毕");
}
});
}
executorService.shutdown();
在该示例中,创建了一个 CachedThreadPool
线程池,并提交了 10 个任务。由于该线程池的特性,当可用线程不够时,会创建新的线程,因此在该示例中,10 个任务会同时被执行。
总结
通过本文的介绍,我们了解了 Java 中的线程池特性及其常见的使用方式,并通过具体的代码实现进一步加深了理解。线程池可以在多线程的场景中发挥其强大的作用,提高多线程任务执行的效率,减少线程创建和销毁的开销,同时通过线程池的配置,还可以对多线程任务的限制和控制工作来实现对多线程线程的精细管理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:谈谈Java 线程池 - Python技术站