文章主要介绍 ThreadPoolExecutor 线程池的简单使用和相关注意事项
public class ThreadPoolTest {
public static void main(String[] args) {
/// 创建线程池: 核心数量5个,最大数量10个,当线程在200毫秒没内没反应关闭线程,缓存列队5个
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, 10, 200, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5));
for(int i = 0; i < 20; i++) {
TaskTest task = new TaskTest(1000000 + i);
executor.execute(task);
System.out.println(
"执行中的线程数量:" + executor.getPoolSize() +
",等待执行的任务数目:" + executor.getQueue().size() +
",执行完毕的任务数目:" + executor.getCompletedTaskCount());
}
executor.shutdown();
/// 从运行日志可看出,池中线程数量本来是5个,在缓存队列满后逐步加到了10个,但再往后就加不进去了,如果再加就会报错:
/// Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.hui.threadPool.TaskTest@19bb089b rejected from java.util.concurrent.ThreadPoolExecutor@4563e9ab[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
// at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
// at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
// at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
// at com.hui.threadPool.ThreadPoolTest.main(ThreadPoolTest.java:15)
/// 如果想要不断添加到缓存队列而不报错,可以将缓存队列设置为new LinkedBlockingQueue<>(),此时最大数量将失效 !!!
ThreadPoolExecutor executor2 = new ThreadPoolExecutor(
5, 10, 200, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
}
}
任务类为:
public class TaskTest implements Runnable {
private int taskId;
public TaskTest(int id) {
this.taskId = id;
}
@SuppressWarnings("static-access")
@Override
public void run() {
System.out.println("开始执行任务 " + taskId);
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务 " + taskId + "执行完毕");
}
}