new ThreadPoolExecutor DiscardPolicy 实例
时间: 2023-11-02 08:15:28 浏览: 93
下面是一个使用 `ThreadPoolExecutor` 和 `DiscardPolicy` 的示例:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorDemo {
public static void main(String[] args) {
// 创建一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 0L, TimeUnit.MILLISECONDS,
new MyQueue<>(2), new ThreadPoolExecutor.DiscardPolicy());
// 提交 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃
for (int i = 1; i <= 6; i++) {
executor.submit(new MyTask(i));
}
executor.shutdown();
}
static class MyTask implements Runnable {
private int taskId;
MyTask(int taskId) {
this.taskId = taskId;
}
@Override
public void run() {
System.out.println("Task #" + taskId + " is running on " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task #" + taskId + " is completed.");
}
}
static class MyQueue<E> extends java.util.concurrent.LinkedBlockingQueue<E> {
MyQueue(int capacity) {
super(capacity);
}
@Override
public boolean offer(E e) {
// 如果队列已满,则直接丢弃新任务
return super.offer(e) || remove(size() - 1);
}
}
}
```
在上面的示例中,我们创建了一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池,并设置拒绝策略为 `DiscardPolicy`。
我们提交了 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃。这是因为任务队列容量为 2,当任务队列已满时,会创建新的线程执行任务,但是最大线程数为 4,此时已经有 2 个线程在运行,因此只能创建 2 个新的线程,而新的任务又有 2 个,因此后面的 2 个任务没有办法被执行,而是被丢弃了。
阅读全文