文章目录
引言
在Java并发编程中,了解线程池的任务提交过程对于正确使用线程池至关重要。本文将详细介绍任务从提交到执行的完整流程,包括任务提交方式、执行流程以及相关的异常处理机制。
一、任务提交方式
1.1 execute方法
execute方法是ThreadPoolExecutor提供的最基本的任务提交方式,用于提交不需要返回值的任务。它只接受Runnable类型的任务,不会返回任务的执行结果。
public class ExecuteExample {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 4,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2)
);
executor.execute(() -> {
try {
Thread.sleep(1000);
System.out.println("Task executed by " +
Thread.currentThread().getName());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
}
1.2 submit方法
submit方法是通过ExecutorService接口提供的任务提交方式,可以提交有返回值的任务。它接受Callable或Runnable类型的任务,并返回Future对象。
public class SubmitExample {
public static void main(String[] args) throws Exception {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 4,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2)
);
// 提交Callable任务
Future<String> future = executor.submit(() -> {
Thread.sleep(1000);
return "Task result";
});
// 获取任务结果
String result = future.get();
System.out.println("Task result: " + result);
}
}
二、任务执行流程
2.1 核心流程分析
当任务提交到线程池后,线程池会根据当前的运行状态和配置来决定如何处理任务。一般会经过以下判断流程:核心线程数判断、任务队列判断、最大线程数判断。
public class TaskExecutionFlow {
private ThreadPoolExecutor createThreadPool() {
return new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60L, TimeUnit.SECONDS, // 线程存活时间
new ArrayBlockingQueue<