1
7
如果您担心中断任务的执行可能会使事情处于糟糕的状态,您只需将其标记为已取消,以便
编写能够正确处理中断的线程代码一点也不简单,因此人们可能只希望避免它。
可以找到一些信息
here
,
here
当然,在这本伟大的书中
Concurrent Programming in Java
(由最初写信的人写的)
|
2
9
TL;DR;
对于并发性和取消,有两件重要的事情需要理解。 第一个是Java取消是纯合作的。Java通过取消阻塞方法、中断中断和在线程上设置标志来发出取消请求。任务实现负责通知取消请求并自行取消。布赖恩·戈茨解释了他的职位被打断的原因 Dealing with InterruptedException . 并非所有的任务实现都能正确地处理中断。 第二点要指出的是,未来对象是将来要执行的任务结果的占位符。如果没有大量线程在运行,任务可能立即开始执行,但也可能所有线程都已被使用,任务必须等待。仅仅因为您有一个对未来对象的引用,并不意味着相应的任务实际上已经开始运行。这有点像预约。 您有一个将来的对象,但任务可能处于以下状态之一:
如果任务处于第一状态“等待”,则两者都处于
如果任务处于“已完成”的第三种状态,则两种状态都不相同
这个
如果任务正在运行并且
如果任务正在运行并且
总结:
|
3
1
我有一个用例,您可能会感兴趣:我有一个执行一组计划任务的线程。其中一项任务可能由其自身或另一项任务重新安排。
为此,我使用
如果从计划任务本身调用此代码,则取消操作将是一个“不操作”,并且该任务将被计划在将来再次运行。如果代码是从另一个上下文调用的,则即将到来的任务尚未开始执行,因此它将被取消,并替换为计划在新时间执行的任务。 |
a a · 为什么在这个可重入锁示例中需要引用计数? 2 年前 |
Grant · goroutines有高空闲唤醒电话 2 年前 |
hoaz · 如何安全地清理并发映射 6 年前 |
Alanpatchi · int基元类型的volatile声明 6 年前 |