import java.util.concurrent.*;
public class CustomThreadPoolExample {
public static void main(String[] args) {
// 创建一个自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
60, // 空闲线程的存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(10), // 任务队列,最多容纳10个任务
new CustomThreadFactory(), // 自定义线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
// 提交任务到线程池
for (int i = 0; i < 15; i++) {
int taskNumber = i + 1;
executor.submit(() -> {
System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(2000); // 模拟任务执行时间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("Task " + taskNumber + " is completed.");
});
}
// 关闭线程池
executor.shutdown();
try {
if (!executor.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
}
// 自定义线程工厂
static class CustomThreadFactory implements ThreadFactory {
private int count = 0;
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "Custom-Thread-" + (++count));
}
}
}
ThreadPoolExecutor:这是 Java 中用于创建自定义线程池的主要类。通过它可以精确控制线程池的核心线程数、最大线程数、空闲线程的存活时间等参数。
核心线程数和最大线程数:corePoolSize
是线程池中保持的最小线程数,即使这些线程是空闲的;maximumPoolSize
是线程池允许的最大线程数。当任务队列已满且当前线程数小于最大线程数时,会创建新线程来处理任务。
空闲线程的存活时间:keepAliveTime
是指当线程数超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。
任务队列:workQueue
用于保存等待执行的任务。这里使用了 LinkedBlockingQueue
,并设置了队列的最大容量为 10。
线程工厂:threadFactory
用于创建新线程。我们实现了一个自定义的 ThreadFactory
,以便为每个新线程指定一个有意义的名字。
拒绝策略:当线程池无法处理新任务(例如,线程数已达最大且任务队列已满)时,可以设置拒绝策略。这里使用了 CallerRunsPolicy
,它会将任务回退给调用者线程执行。
提交任务:使用 submit()
方法向线程池提交任务。每个任务会在某个线程中执行,并打印出任务编号和执行线程的名字。
关闭线程池:使用 shutdown()
方法优雅地关闭线程池,确保所有已提交的任务都执行完毕后再关闭。awaitTermination()
用来等待线程池中的任务完成,超时后会强制关闭线程池。
上一篇:java localtime
下一篇:java 验证码
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站