线程池
大约 3 分钟
线程池
线程池设计思想
Java线程池的设计思想是为了提高线程的使用效率和响应能力,以及降低资源消耗和线程管理的复杂度。
Java线程池主要具有以下设计思想:
- 重复使用线程:Java线程池中的线程可以被重复使用,而不是为每个任务创建一个新的线程。这样可以避免线程的创建和销毁带来的开销,提高程序的性能。
- 控制资源消耗:Java线程池可以控制线程的数量,从而控制程序对系统资源的消耗。当线程数量过多时,可以避免过多的线程同时占用资源,导致资源浪费和系统负载过高。
- 提高响应能力:Java线程池可以快速响应任务的提交和执行,从而提高程序的响应能力。当有新的任务提交时,线程池可以立即分配线程执行任务,而不用等待新的线程创建和就绪。
- 任务执行管理:Java线程池可以对任务的执行进行管理,例如控制任务的执行顺序、限制任务的执行时间、处理任务的异常等。这样可以保证任务的执行质量,并提高程序的可靠性。
Java线程池通过ThreadPoolExecutor类来实现,该类提供了可重用的线程池,并提供了丰富的配置选项,可以根据实际需要来配置线程池的参数,以达到最佳的性能和效果。
Java线程池的设计思想是基于生产者-消费者模式,通过工作线程来执行任务,从而实现高效的并发处理。
如何停止线程池中的线程
在Java中,线程池中的线程是并发执行的,不支持直接停止某一个线程。但是可以通过以下几种方式中断线程的执行:
- 使用线程的interrupt方法中断线程
ExecutorService executor = Executors.newFixedThreadPool(5);
Future future = executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
});
// 停止某个线程
executor.shutdownNow();
future.cancel(true);
- 使用线程的interrupted方法检查中断标志位
ExecutorService executor = Executors.newFixedThreadPool(5);
Future future = executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
});
// 停止某个线程
executor.shutdownNow();
if (Thread.interrupted()) {
// 中断标志位为true表示被中断
// 处理中断逻辑
}
- 使用线程的isInterrupted方法检查中断状态
ExecutorService executor = Executors.newFixedThreadPool(5);
Future future = executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
});
// 停止某个线程
executor.shutdownNow();
if (Thread.interrupted()) {
// 中断标志位为true表示被中断
// 处理中断逻辑
Thread.currentThread().interrupt();
}
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Working...");
Thread.sleep(5000);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Done";
});
System.out.println("Future status: " + future.isDone());
Thread.sleep(3000);
System.out.println("Try to cancel future...");
future.cancel(true);
System.out.println("Future status: " + future.isCancelled());
System.out.println("Future result: " + future.get());
executor.shutdown();
}
}
线程池的核心参数
线程池的核心参数如下:
corePoolSize
:核心线程数,即线程池维护的最低线程数。maximumPoolSize
:最大线程数,即线程池维护的最大线程数。keepAliveTime
:线程空闲 timeout,即线程空闲 timeout 时间。unit
:时间单位。workQueue
:任务队列,用于保存等待线程执行的任务。threadFactory
:线程工厂,用于创建新线程。handler
:拒绝执行策略,当任务队列和线程池都达到最大容量时,将执行任务的续行策略。