Java高并发ThreadPoolExecutor类解析线程池执行流程
什么是线程池?
线程池是用于动态管理线程创建、销毁的线程组件,试图减少线程创建、销毁开销、使线程复用以提高并发性能的一种机制。线程池中有一个线程队列,用于存放等待执行的任务。线程池创建的线程数通常取决于处理器的内核数,或者是按照实际情况动态调整。
Java中提供了ThreadPoolExecutor
类来实现线程池。
ThreadPoolExecutor类解析
ThreadPoolExecutor类的构造方法
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)
构造一个新的ThreadPoolExecutor
。
参数说明:
corePoolSize
:线程池中的核心线程数,可以执行任务或者等待新任务执行。maximumPoolSize
:线程池中允许的最大线程数,一般情况下线程数等于CPU核数或者2倍的CPU核数keepAliveTime
:线程池中非核心线程仍然存活的时间。unit
:存活时间的时间单位。workQueue
:等待队列。
线程池执行流程
-
提交任务到线程池
当一个新的任务提交给线程池时,它首先检查核心线程池是否已满,如果没有满,就创建一个新的线程来执行任务,否则就将任务加入到等待队列中。
-
执行任务
当一个线程完成当前任务时,它会从等待队列中取下一个任务来执行,如果等待队列中没有任务,它就会被阻塞,直到有任务可用。
-
关闭线程池
当调用
shutdown()
方法时,线程池会停止接受新的任务,等待执行的任务将继续执行,当所有任务完成后,线程池中的所有线程才会被销毁。调用
shutdownNow()
方法时,线程池会立即停止所有任务以及正在执行任务的线程,并将等待队列中的任务移除,返回未执行的任务列表。
示例说明
示例一
public class ThreadPoolTest {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5));
for (int i = 1; i <= 15; i++) {
threadPoolExecutor.execute(new TaskThread(i));
}
threadPoolExecutor.shutdown();
}
}
class TaskThread implements Runnable {
private int taskNum;
public TaskThread(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在执行task " + taskNum);
try {
Thread.currentThread().sleep(4000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task " + taskNum + "执行完成");
}
}
该示例中,我们创建了一个ThreadPoolExecutor
线程池,设置了核心线程数为3,最大线程数为5,等待队列长度为5。通过循环创建15个任务,提交给线程池执行。当运行以上程序时,可以看到输出的线程执行情况。
示例二
public class CachedThreadPoolTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 1; i <= 5; i++) {
executorService.execute(new TaskThread(i));
}
executorService.shutdown();
}
}
class TaskThread implements Runnable {
private int taskNum;
public TaskThread(int num) {
this.taskNum = num;
}
@Override
public void run() {
System.out.println("正在执行task " + taskNum);
try {
Thread.currentThread().sleep(4000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task " + taskNum + "执行完成");
}
}
该示例中,我们使用Java自带的线程池Executors.newCachedThreadPool()
,并创建5个任务提交给线程池流程执行。当运行以上程序时,可以看到输出的线程执行情况。由于使用的是无界线程池,因此线程会不断被创建,所以该示例会一直执行下去,不会停止。我们需要手动调用executorService.shutdown()
方法来关闭线程池。
结论
本文介绍了Java中线程池实现机制的相关内容,以及ThreadPoolExecutor
类的使用说明。线程池是一种常用的提高并发性能的机制,它可以共享线程、减少线程创建、销毁的开销,提高程序的性能。了解线程池的使用方法有助于提高程序设计的质量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java高并发ThreadPoolExecutor类解析线程池执行流程 - Python技术站