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();
}
}