java.util.concurrent.ThreadPoolExecutor 的 shutdown() shutdownNow() 区别
时间: 2023-11-23 13:56:31 浏览: 182
`java.util.concurrent.ThreadPoolExecutor`是Java中用于管理线程池的类。`shutdown()`和`shutdownNow()`都是用于关闭线程池的方法,但它们之间有一些区别。
- `shutdown()`方法:该方法将线程池状态设置为SHUTDOWN,不再接受新任务,但会等待所有已经提交的任务执行完成后再关闭线程池。如果在调用`shutdown()`方法后又提交了新任务,这些新任务将会被拒绝执行并抛出`RejectedExecutionException`异常。
- `shutdownNow()`方法:该方法将线程池状态设置为STOP,不再接受新任务,并尝试停止所有正在执行的任务,包括等待执行的任务。该方法会尝试中断正在执行的任务,如果任务无法被中断,则会保持运行状态。该方法返回一个`List<Runnable>`,其中包含所有等待执行的任务。
以下是一个示例代码,演示了如何使用`ThreadPoolExecutor`类以及如何使用`shutdown()`和`shutdownNow()`方法:
```java
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
// 创建一个线程池,最多同时执行2个任务
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
// 提交5个任务
for (int i = 0; i < 5; i++) {
executor.submit(new Task(i));
}
// 关闭线程池
executor.shutdown();
// 等待所有任务执行完成
executor.awaitTermination(1, TimeUnit.MINUTES);
// 输出线程池状态
System.out.println("线程池状态:" + (executor.isTerminated() ? "已关闭" : "未关闭"));
// 再次提交任务,会抛出RejectedExecutionException异常
executor.submit(new Task(5));
// 关闭线程池
executor.shutdownNow();
// 输出线程池状态
System.out.println("线程池状态:" + (executor.isTerminated() ? "已关闭" : "未关闭"));
}
static class Task implements Runnable {
private int taskId;
public Task(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Task " + taskId + " is interrupted");
}
System.out.println("Task " + taskId + " is completed");
}
}
}
```
阅读全文