Java 线程池中线程怎么复用
java 线程池通过让工作线程在无限循环中反复调用 gettask() 来获取任务并执行,从而实现线程复用。核心逻辑在于:当线程执行完一个任务后,不会直接退出,而是继续从阻塞队列中拉取下一个任务;只有当线程池处于关闭状态或达到最大空闲时间时,循环才会终止,线程随之销毁。

线程池如何获取和提交任务
线程池通过 execute() 方法接收外部提交的任务,并将其放入内部的工作队列中。工作线程启动后会进入等待状态,一旦队列中有新任务,线程就会被唤醒并取出任务执行。这种机制确保了线程的生命周期独立于单个任务的执行过程,从而支持多次复用。

import java.util.concurrent.*;
public class ThreadReuseDemo {
public static void main(String[] args) {
// 创建固定大小的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 提交第一个任务
pool.execute(() -> System.out.println("Task 1 executed by: " + Thread.currentThread().getName()));
// 提交第二个任务
pool.execute(() -> System.out.println("Task 2 executed by: " + Thread.currentThread().getName()));
// 再次提交任务,观察是否由同一线程处理
pool.execute(() -> System.out.println("Task 3 executed by: " + Thread.currentThread().getName()));
// 关闭线程池
pool.shutdown();
}
}线程复用的具体控制条件是什么
线程复用并非无限制的,它受到核心线程数、非核心线程的空闲存活时间以及线程池状态的控制。当线程池中的线程数量小于核心线程数时,新任务会优先创建新线程;当超过核心线程数后,多余的任务会被放入队列,而空闲的非核心线程会在超过指定时间(keepAliveTime)后自动退出,不再复用。此外,如果调用 shutdownNow() 或 interrupt(),正在复用的线程也会被迫中断。
立即学习“Java免费学习笔记(深入)”;

import java.util.concurrent.*;
public class ThreadControlDemo {
public static void main(String[] args) throws InterruptedException {
// 核心线程数为1,非核心线程空闲时间为1秒
ThreadPoolExecutor pool = new ThreadPoolExecutor(
1, 2, 1L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(10)
);
// 提交任务触发线程创建
pool.execute(() -> {
System.out.println("Task 1: " + Thread.currentThread().getName());
});
// 等待任务执行完毕
Thread.sleep(2000);
// 此时核心线程可能仍在复用,但非核心线程若存在则已超时退出
// 再次提交任务,若核心线程未死,将继续复用
pool.execute(() -> {
System.out.println("Task 2: " + Thread.currentThread().getName());
});
pool.shutdown();
}
}


















