[英]Java Threading Issue
我正在像这样同步线程的对象:
synchronized(threadObject){
try{
threadObject.interrupt();
}catch(Exception ex){
//catch error here.
}finally{
threadObject.notifyAll();
}
}
现在,我的问题是:
是否可以中断同步块内部的线程,该线程的同步对象是要中断的线程? 就像在示例代码中一样。
是。 我不明白为什么这行不通。 synchronized
关键字与interrupt
方法非常正交。 (请注意,违反await
和notify
,你不给自己打电话时,物体监视所需的interrupt
。)
我是否仍可以通知其他持有被中断线程对象的线程? 就像在示例代码中一样。
是的,只要您拥有对象监视器,就可以在任何对象上调用notifyAll
。 同样, wait/notify
与interrupt
方法非常正交。
你的问题似乎表明,你已经误解了使用的synchronized
。 通常的用例是在表示某些资源的对象上进行同步,您希望避免同时访问这些资源。 线程本身很少代表这种资源。
该对象将像往常一样工作。 唯一的规定是,在您完成线程处理之前,在threadObject的监视器上同步的其他线程将被阻塞。 所以是的,您可以同时做这两个。
这两个问题的答案都是肯定的。
但是,您的示例有些奇怪。 我从未遇到过将Thread
用作原始锁的情况。 而且您在示例中所做的事情似乎并没有取得任何成就。
如果threadObject
与Thread.currentThread()
相同,则对interrupt()
的调用将只设置该线程的中断标志...,该代码段中会注意到该标志。
如果threadObject
是其他Thread
对象,则该线程将被中断。 但是我们(在这里)看不到该线程将要执行的代码,并且我们也不知道它是否将在threadObject
上等待。 如果不是,则好好将interrupt()
和notify()
转到不同的线程...
最重要的是,您通常不会使用Thread对象作为锁,并且通常不会使用interrupt()作为ersatz notify()发送。
(也许此示例并非旨在表示真实的用例。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.