Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用线程不会';拒绝执行异常后,不能停止_Java_Multithreading_Threadpool - Fatal编程技术网

Java 调用线程不会';拒绝执行异常后,不能停止

Java 调用线程不会';拒绝执行异常后,不能停止,java,multithreading,threadpool,Java,Multithreading,Threadpool,当threadpool中的一个线程抛出RejectedExecutionException时,为什么主线程不停止?我在这里做错了什么吗?线程池中的第三个线程正在抛出RejectedExecutionException,我没有在主线程中处理此异常。因此,我必须处理此异常以使主线程停止。任何帮助都将不胜感激 public static void main(String[] args) { ExecutorService threadPool = new ThreadPoolE

当threadpool中的一个线程抛出RejectedExecutionException时,为什么主线程不停止?我在这里做错了什么吗?线程池中的第三个线程正在抛出RejectedExecutionException,我没有在主线程中处理此异常。因此,我必须处理此异常以使主线程停止。任何帮助都将不胜感激

    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很乐意帮忙!