1. 举个案例,复现异常:
public class ThreadPoolExecutorTest implements Runnable {
int indexV = 0;
public ThreadPoolExecutorTest(int index) {
indexV = index;
}
public static void main(String[] args) {
// 由于ArrayBlockingQueue内部只使用了一个锁来隔离读和写的操作,因此效率没有使用了两个锁来隔离读写操作的LinkedBlockingQueue高,故而不推荐使用ArrayBlockingQueue
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(10);// 无界队列,但是可以固定大小;
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, queue);
for (int index = 0; index < 100; index++) {
try {
poolExecutor.submit(new ThreadPoolExecutorTest(index));
} catch (RejectedExecutionException e) {
e.printStackTrace();
System.out.println("线程池关闭后不允许向线程池中添加任务");
}
}
}
@Override
public void run() {
System.out.println("厉害咯,我的哥: " + indexV);
}
}
执行以上代码,会报RejectedExecutionException异常,见文知义是某些线程被线程池执行器拒绝执行;
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@891d76 rejected from java.util.concurrent.ThreadPoolExecutor@121e5a[Running, pool size = 10, active threads = 7, queued tasks = 3, completed tasks = 14]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2048)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
at javabasic.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:51)
2.ThreadPoolExecutor 方法的参数定义:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,