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