四种基本拒绝策略:
1.AbortPolicy – 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
2.CallerRunsPolicy – 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
3.DiscardOldestPolicy – 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
4.DiscardPolicy – 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
测试:
AbortPolicy:
package com.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Reject {
public static void main(String[] args) {
//创建一个核心线程为3 ,最大线程为5的,空闲时间0 ,单位,队列容量大小,拒绝策略为直接抛出异常
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 7, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.AbortPolicy());
for (int i=0;i<10;i++){
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "runing.....");
}
});
}
//关闭线程池
threadPoolExecutor.shutdown();
}
}
CallerRunsPolicy :
DiscardOldestPolicy :
package com.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Reject {
public static void main(String[] args) {
//创建一个核心线程为3 ,最大线程为5的,空闲时间0 ,单位,队列容量大小,拒绝策略为直接抛出异常
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.DiscardOldestPolicy());
for (int i=0;i<15;i++){
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "runing.....");
}
});
}
//关闭线程池
threadPoolExecutor.shutdown();
}
}
DiscardPolicy:
package com.thread;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Reject {
public static void main(String[] args) {
//创建一个核心线程为3 ,最大线程为5的,空闲时间0 ,单位,队列容量大小,拒绝策略为直接抛出异常
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1), new ThreadPoolExecutor.DiscardPolicy());
for (int i=0;i<15;i++){
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "runing.....");
}
});
}
//关闭线程池
threadPoolExecutor.shutdown();
}
}