Java 调用线程不会';拒绝执行异常后,不能停止
当threadpool中的一个线程抛出RejectedExecutionException时,为什么主线程不停止?我在这里做错了什么吗?线程池中的第三个线程正在抛出RejectedExecutionException,我没有在主线程中处理此异常。因此,我必须处理此异常以使主线程停止。任何帮助都将不胜感激Java 调用线程不会';拒绝执行异常后,不能停止,java,multithreading,threadpool,Java,Multithreading,Threadpool,当threadpool中的一个线程抛出RejectedExecutionException时,为什么主线程不停止?我在这里做错了什么吗?线程池中的第三个线程正在抛出RejectedExecutionException,我没有在主线程中处理此异常。因此,我必须处理此异常以使主线程停止。任何帮助都将不胜感激 public static void main(String[] args) { ExecutorService threadPool = new ThreadPoolE
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(1));
threadPool.execute(new TestOne());
threadPool.execute(new TestTwo());
threadPool.execute(new TestThree());
threadPool.shutdown();
try {
threadPool.awaitTermination(2L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("main thread stopped");
}
}
class TestOne implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task one");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
class TestTwo implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task two");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
class TestThree implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task three");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
publicstaticvoidmain(字符串[]args){
ExecutorService threadPool=新的ThreadPoolExecutor(1,1,0L,TimeUnit.ms,
新的ArrayBlockingQueue(1));
execute(newtestone());
execute(newtesttwo());
execute(newtestthree());
threadPool.shutdown();
试一试{
线程池。等待终止(2L,时间单位。秒);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
System.out.println(“主线程停止”);
}
}
类TestOne实现可运行{
公开募捐{
对于(int i=0;i<10;i++){
System.out.println(“执行任务一”);
试一试{
睡眠(10);
}捕获(可丢弃的e){
e、 printStackTrace();
}
}
}
}
类TestTwo实现可运行{
公开募捐{
对于(int i=0;i<10;i++){
System.out.println(“执行任务二”);
试一试{
睡眠(10);
}捕获(可丢弃的e){
e、 printStackTrace();
}
}
}
}
类TestThree实现可运行{
公开募捐{
对于(int i=0;i<10;i++){
System.out.println(“执行任务三”);
试一试{
睡眠(10);
}捕获(可丢弃的e){
e、 printStackTrace();
}
}
}
}
线程池中没有线程抛出RejectedExecutionException
。将任务提交到线程池的主线程实际上抛出了RejectedExecutionException
主线程在提交时不会阻塞,因为规范规定它不应该阻塞。有一些机制可以做到这一点,请参阅
线程池中没有线程抛出
RejectedExecutionException
。将任务提交到线程池的主线程实际上抛出了RejectedExecutionException
主线程在提交时不会阻塞,因为规范规定它不应该阻塞。有一些机制可以做到这一点,请参阅
谢谢@John,我收到了这个。我还注意到,若我只提交线程池中的两个线程执行,主线程不会抛出RejectedExecutionException。但在这里,阻塞队列的大小是一,即使最大池大小也是一。如果队列已满,并且无法添加更多线程,则可能会引发上述异常。那么为什么主线程只在第三个线程执行时抛出异常,而不在第二个线程执行时抛出异常。当所有线程都处于活动状态且队列已满时,将抛出
RJE
。提交第一个任务时,唯一的线程处于活动状态,队列现在为空。提交第二个任务时,线程处于活动状态,队列已满。第三个任务抛出RJE
。你可以在这里阅读我的答案。谢谢约翰。这很有用。@Sunny很乐意帮忙!谢谢@John,我知道了。我还注意到,若我只提交线程池中的两个线程执行,主线程不会抛出RejectedExecutionException。但在这里,阻塞队列的大小是一,即使最大池大小也是一。如果队列已满,并且无法添加更多线程,则可能会引发上述异常。那么为什么主线程只在第三个线程执行时抛出异常,而不在第二个线程执行时抛出异常。当所有线程都处于活动状态且队列已满时,将抛出RJE
。提交第一个任务时,唯一的线程处于活动状态,队列现在为空。提交第二个任务时,线程处于活动状态,队列已满。第三个任务抛出RJE
。你可以在这里阅读我的答案。谢谢约翰。这很有用。@Sunny很乐意帮忙!