我正在同步这个线程的对象:
synchronized(threadObject){
try{
threadObject.interrupt();
}catch(Exception ex){
//catch error here.
}finally{
threadObject.notifyAll();
}
}
现在,我的问题是:
答案 0 :(得分:1)
可以中断同步块内的线程,其同步的对象是要中断的线程吗?与示例代码中一样。
是。我不明白为什么那不起作用。 synchronized
关键字与interrupt
方法非常正交。 (请注意,与await
和notify
相反,您在调用interrupt
时拥有对象监视器需要 。)
我是否仍然可以通知其他持有被中断线程对象的线程?与示例代码中一样。
是的,只要您拥有对象监视器,就可以在任何对象上调用notifyAll
。同样,wait/notify
- 机制与interrupt
方法非常正交。
您的问题似乎表明您误解了synchronized
的使用。通常的用例是在表示您希望避免并发访问的某个资源的对象上进行同步。 线程本身很少代表这样的资源。
答案 1 :(得分:0)
该对象正常工作。唯一的规定是在threadObject的监视器上同步的其他线程将阻塞,直到您完成线程。所以是的,你可以做到这两点。
答案 2 :(得分:0)
答案 3 :(得分:0)
这两个问题的答案都是肯定的。
但是,你的例子有点奇怪。我从未遇到过使用Thread
作为原始锁的情况。而你在这个例子中所做的事情似乎并没有取得任何成就。
如果threadObject
与Thread.currentThread()
相同,则对interrupt()
的调用只会设置此线程的中断标志...在该代码片段中会被注意到。< / p>
如果threadObject
是其他Thread
个对象,则该线程将被中断。但我们看不到(这里)该线程将执行的代码,我们不知道它是否会等待threadObject
。如果不是interrupt()
和notify()
井有不同的线程......
底线是您通常不会将Thread对象用作锁,并且通常不会使用interrupt()作为 ersatz notify()。
(也许这个例子不是为了代表一个真实的用例。)