如何在Java中使用线程池
在Java中,线程池是一种用于管理线程的机制,可以提高程序的效率和性能。使用线程池可以避免频繁地创建和销毁线程,以及有效地利用系统资源。本文将介绍如何在Java中使用线程池。
1. 创建线程池
Java提供了ThreadPoolExecutor类来创建线程池。创建线程池的方法如下:
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
其中,nThreads表示线程池大小,即线程池中最大线程数。
2. 向线程池提交任务
线程池创建完成后,我们需要向线程池提交任务。提交任务的方法如下:
executor.execute(new Runnable() {
public void run() {
// 任务代码
}
});
其中,执行的任务是实现了Runnable接口的类或Lambda表达式。
3. 关闭线程池
在程序结束时需要关闭线程池,释放系统资源。关闭线程池的方法如下:
executor.shutdown();
线程池关闭后,将不能再接受新的任务。
4. 线程池的状态
线程池有3种状态:运行、关闭和已终止。可以通过以下方法获取线程池的状态:
executor.isShutdown(); // 判断线程池是否关闭 executor.isTerminated(); // 判断线程池是否已终止
5. 线程池的配置
线程池可以根据需要进行配置。ThreadPoolExecutor类提供了一些方法来设置线程池的属性,例如:
executor.setCorePoolSize(int corePoolSize); // 设置核心线程数 executor.setMaximumPoolSize(int maximumPoolSize); // 设置最大线程数 executor.setKeepAliveTime(long time, TimeUnit unit); // 设置线程空闲时间 executor.setThreadFactory(ThreadFactory factory); // 设置线程工厂 executor.setRejectedExecutionHandler(RejectedExecutionHandler handler); // 设置任务拒绝策略
6. 线程池的任务拒绝策略
如果线程池已经达到最大线程数,而任务队列已满,则线程池会采取拒绝策略。ThreadPoolExecutor类提供了4种默认的拒绝策略:
- AbortPolicy:抛出RejectedExecutionException异常
- CallerRunsPolicy:在调用线程中直接执行任务
- DiscardOldestPolicy:丢弃任务队列中最早的任务
- DiscardPolicy:丢弃当前任务
我们也可以自定义任务拒绝策略,实现RejectedExecutionHandler接口即可。
7. 示例代码
下面是一个简单的示例代码,演示了如何使用线程池并设置任务拒绝策略。
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
int nThreads = 5;
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
// 设置任务拒绝策略
executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("任务拒绝:" + r.toString());
}
});
// 向线程池提交任务
for (int i = 0; i < 10; i++) {
executor.execute(new Runnable() {
public void run() {
System.out.println("执行任务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
// 关闭线程池
executor.shutdown();
}
}
上述代码创建了一个大小为5的线程池,向线程池提交了10个任务,并设置了任务拒绝策略。执行任务时,每个任务暂停1秒钟。在执行完所有任务后,关闭了线程池。当任务队列已满时,线程池会打印出“任务拒绝”信息。
