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
ExecutorService关闭方法的行为不同为什么? import java.util.concurrent.ArrayBlockingQueue; 导入java.util.concurrent.ExecutorService; 导入java.util.concurrent.Executors; 导入java.util.concurrent.TimeUnit; 公共类ArrayBlockingQUeueExampe{ 公共静态void main(字符串[]args){ ArrayBlockingQueue q=新的ArrayBlockingQueue(2); 可运行r=()->{ int i=0; while(true){ 试一试{ 系统输出打印项次(“添加:“+i”); q、 put(i++); 时间单位。毫秒。睡眠(1000); }捕捉(中断异常e){ e、 printStackTrace(); } } }; 可运行r2=()->{ while(true){ 试一试{ 整数take=q.take(); System.out.println(“take:+take”); }捕捉(中断异常e){ e、 printStackTrace(); } } }; ExecutorService=Executors.newFixedThreadPool(2); 服务提交(r); 服务提交(r2); service.shutdown(); } }_Java_Multithreading_Executorservice_Blockingqueue - Fatal编程技术网

ExecutorService关闭方法的行为不同为什么? import java.util.concurrent.ArrayBlockingQueue; 导入java.util.concurrent.ExecutorService; 导入java.util.concurrent.Executors; 导入java.util.concurrent.TimeUnit; 公共类ArrayBlockingQUeueExampe{ 公共静态void main(字符串[]args){ ArrayBlockingQueue q=新的ArrayBlockingQueue(2); 可运行r=()->{ int i=0; while(true){ 试一试{ 系统输出打印项次(“添加:“+i”); q、 put(i++); 时间单位。毫秒。睡眠(1000); }捕捉(中断异常e){ e、 printStackTrace(); } } }; 可运行r2=()->{ while(true){ 试一试{ 整数take=q.take(); System.out.println(“take:+take”); }捕捉(中断异常e){ e、 printStackTrace(); } } }; ExecutorService=Executors.newFixedThreadPool(2); 服务提交(r); 服务提交(r2); service.shutdown(); } }

ExecutorService关闭方法的行为不同为什么? import java.util.concurrent.ArrayBlockingQueue; 导入java.util.concurrent.ExecutorService; 导入java.util.concurrent.Executors; 导入java.util.concurrent.TimeUnit; 公共类ArrayBlockingQUeueExampe{ 公共静态void main(字符串[]args){ ArrayBlockingQueue q=新的ArrayBlockingQueue(2); 可运行r=()->{ int i=0; while(true){ 试一试{ 系统输出打印项次(“添加:“+i”); q、 put(i++); 时间单位。毫秒。睡眠(1000); }捕捉(中断异常e){ e、 printStackTrace(); } } }; 可运行r2=()->{ while(true){ 试一试{ 整数take=q.take(); System.out.println(“take:+take”); }捕捉(中断异常e){ e、 printStackTrace(); } } }; ExecutorService=Executors.newFixedThreadPool(2); 服务提交(r); 服务提交(r2); service.shutdown(); } },java,multithreading,executorservice,blockingqueue,Java,Multithreading,Executorservice,Blockingqueue,我正在代码末尾调用shutdown(),因此执行器服务必须立即关闭,之前提交的任务不应执行,但当我运行此代码时,它正在持续运行为什么?指示启动了“有序”关闭: …执行以前提交的任务,但不接受新任务 因此,您的无限任务正在执行,并且不会接受任何新任务(无论如何,您不会提供任何新任务) 反过来说: 尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。 此方法不会等待主动执行的任务终止。习惯于这样做 shutdown()用于正常关机,这意味着它只会在所有提交的任务完成

我正在代码末尾调用
shutdown()
,因此执行器服务必须立即关闭,之前提交的任务不应执行,但当我运行此代码时,它正在持续运行为什么?

指示启动了“有序”关闭:

…执行以前提交的任务,但不接受新任务

因此,您的无限任务正在执行,并且不会接受任何新任务(无论如何,您不会提供任何新任务)

反过来说:

尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。 此方法不会等待主动执行的任务终止。习惯于这样做

shutdown()用于正常关机,这意味着它只会在所有提交的任务完成之前退出。shutdownNow()将中断当前所有正在执行的任务并关闭。但是,我注意到,在您的代码中,您正在捕获InterruptedException而没有退出循环,因此您的程序将在中断后继续运行

如果要立即终止,需要更改两个位置:

  • 立即使用关机
  • 捕获中断异常时中断循环
  • import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    public class ArrayBlockingQUeueExampe {
    
        public static void main(String[] args) {
            ArrayBlockingQueue<Integer> q = new ArrayBlockingQueue<>(2);
    
            Runnable r = () -> {
                int i = 0;
                while (true) {
                    try {
                        System.out.println("Added : "+i);
                        q.put(i++);
                        TimeUnit.MILLISECONDS.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
    
            Runnable r2 = () -> {
                while (true) {
                    try {
                        Integer take = q.take();
                        System.out.println("Taken : "+take);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
    
            ExecutorService  service = Executors.newFixedThreadPool(2);
            service.submit(r);
            service.submit(r2);
            service.shutdown();
        }
    }