您好,登录后才能下订单哦!
在Java中,ExecutorService
是一个接口,它提供了一种将任务提交给执行的机制。通常,我们会使用Executors
工厂类来创建一个ExecutorService
实例。线程池的配置主要涉及到以下几个方面:
核心线程数(corePoolSize):线程池的基本大小,即在没有任务执行时线程池的大小,并且只有在工作队列满了之后才会创建超出这个数量的线程。
最大线程数(maximumPoolSize):线程池允许的最大线程数。
存活时间(keepAliveTime):当线程数大于核心线程数时,这个参数定义了超过核心线程数的线程在空闲时可以存活的时间。
时间单位(unit):keepAliveTime
参数的时间单位。
工作队列(workQueue):用于保存等待执行的任务的阻塞队列。
线程工厂(threadFactory):用于创建新线程的工厂。
拒绝策略(handler):当任务无法被接受时的处理策略。
以下是一个使用Executors
工厂类创建ExecutorService
的例子:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个核心线程数为2,最大线程数为5,空闲线程存活时间为10秒的线程池
ExecutorService executorService = new ThreadPoolExecutor(
2, // 核心线程数
5, // 最大线程数
10, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(10), // 工作队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
// 提交任务到线程池
for (int i = 0; i < 15; i++) {
final int taskNumber = i;
executorService.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");
});
}
// 关闭线程池
executorService.shutdown();
}
}
在这个例子中,我们创建了一个ThreadPoolExecutor
实例,它允许最多5个线程同时运行,并且有一个容量为10的任务队列。当队列满了之后,如果还有新的任务提交,线程池会尝试创建新的线程,直到达到最大线程数。如果超过了最大线程数,新的任务将会根据拒绝策略进行处理。
请注意,当不再需要ExecutorService
时,应该调用shutdown()
方法来优雅地关闭线程池,这样可以确保所有已提交的任务都得到执行,并且线程池中的线程能够正常退出。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。