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 为什么shutdownNow()方法能够在可调用对象内中断for循环,但在可运行对象内却无法中断for循环,除非我们专门调用break?_Java_Multithreading_Executorservice - Fatal编程技术网

Java 为什么shutdownNow()方法能够在可调用对象内中断for循环,但在可运行对象内却无法中断for循环,除非我们专门调用break?

Java 为什么shutdownNow()方法能够在可调用对象内中断for循环,但在可运行对象内却无法中断for循环,除非我们专门调用break?,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有一个代码段,它运行一个单线程执行器,执行两个任务,一个是可调用的,另一个是可运行的。这两个任务都使用Thread.sleep()delay per iteration运行一个简单的for循环计数器。第二个任务在第一个任务完成后立即开始。awaitTermination()方法应该在执行器成功完成之前关闭它 我知道,waittermination()中的时间一过,shutdownNow()就会调用当前正在执行的任务interrupt(),以某种方式设法立即中断第一个任务中的for循环,并在对象

我有一个代码段,它运行一个单线程执行器,执行两个任务,一个是可调用的,另一个是可运行的。这两个任务都使用
Thread.sleep()
delay per iteration运行一个简单的for循环计数器。第二个任务在第一个任务完成后立即开始。
awaitTermination()
方法应该在执行器成功完成之前关闭它

我知道,
waittermination()
中的时间一过,
shutdownNow()
就会调用当前正在执行的任务
interrupt()
,以某种方式设法立即中断第一个任务中的for循环,并在对象类型为
MyCallableTask
时中止第二个任务。现在,如果我将提交对象的类型更改为
MyRunnableTask
,代码也将按预期终止for循环,但这只是因为我在调用
Thread.sleep()
时在try-catch块中包含了
break

@Override public void run(){
for(int j=0;j
如果没有中断,代码将首先完成for循环,然后停止

我的问题是为什么我们不需要在
MyCallableTask
call()实现中包含任何中断或返回?我的意思是,为什么代码在没有任何附加指令的情况下成功地立即中断
call()
方法中的for循环

@Override public Void call()引发异常{
for(int j=0;j
中断异常
是已检查的异常

您要么在方法内部处理它(使用try/catch),要么声明该方法抛出它(或超类)

可运行的实现不能抛出检查过的异常,如
InterruptedException
(其基本声明没有
抛出异常
抛出InterruptedException
)<代码>可调用
可以,因为它的声明可以


顺便说一句,您的
Runnable
案例应该在中断之前调用
Thread.currentThread().interrupt()
,这样调用该Runnable的任何东西都可以知道它被中断了


你也不需要中断,你把try/catch放在循环的周围而不是里面。

@我想知道是什么中断了
Thread.sleep()
和for-loop-inside
call()
?我的意思是,
shutdownNow()
调用
interrupt()
,它不知何故被捕获在
call()
中,并强制代码立即中断循环。那么谁捕获了
InterruptedException
,谁打破了循环?如果线程在睡眠时被中断,堆栈将展开,直到有东西捕获了InterruptedException。在可运行的情况下,这在代码中。在可调用的情况下,它是调用
call()
方法的外部代码。@jimmayhem谁捕获
InterruptedException
并不重要,重要的是它没有被捕获到循环中,不像
Runnable
中的
catch
在循环中。正如这个答案所说,将结构从loop(try-catch)更改为try(loop)catch,您不需要使用
break
语句。为了澄清您问题的另一点:
shutdownNow()
会立即中断正在运行的任务,而不是“在
waittermination()
中的时间一过即中断”。该方法根本不关心您是否调用
等待终止