任务和线程的启动很容易。在大多数时候,我们都会让它们运行直到结束,或者让它们自行停止。然而,有时候我们希望提前结束任务或线程,或者是因为用户取消了操作,
或者应用程序需要快速关闭。
要使任务和线程能安全、快速、可靠地停止下来,并不是一件容易的事。Java没有提供任何机制安全的终止线程,但它提供了中断(Interruption),这是一种协作机制,能够
使一个线程终止另一个线程当前的工作。
这种协作方式是必要的,我们很少希望某个任务、线程或服务立即停止,因为这种立即停止会使共享的数据结构处于不一致的状态。相反,在编写任务或服务时可以使用一种协作
方式:当需要停止时,它们首先清除当前正在执行的工作,然后再结束。这提供了更好的灵活性,因为任务本身的代码比发出取消请求的代码更清楚如何执行清除工作。
ExecutorService.submit将返回一个Future来描述任务。Future拥有一个cancel方法,该方法带有一个boolean类型的参数mayInterruptIfRunning,表示取消操作是否成功
(这只是表示任务是否能够接受中断,并不是表示任务是否检测并处理中断)。如果mayInterruptIfRunning为true并且任务当前正在某个线程中运行,那么这个线程能被中断。
如果这个参数为false,那么意味着"若任务还没有启动,就不要运行它",这种方式应该用于那些不处理中断的任务中。
除非你清楚线程的中断策略,否则不要中断线程,那么在什么情况下调用cancel可以将参数指定为true?执行任务的线程是由标准的Executor创建的,它实现了一种中断策略使得任务
可以通过中断被取消,所以如果任务在标准的Executor中运行,并通过它们的Future来取消任务,那么可以设置myInterruptIfRunning。当尝试取消某个任务时,不宜直接中断线程
池,因为你并不知道当中断请求到达时正在运行什么任务——只能通过任务的Future来实现取消。