Java线程问题

时间:2011-03-01 15:37:42

标签: java multithreading

我正在同步这个线程的对象:

synchronized(threadObject){
    try{
       threadObject.interrupt();
    }catch(Exception ex){
       //catch error here.
    }finally{
       threadObject.notifyAll();
    }
}

现在,我的问题是:

  1. 可以中断线程 在同步块内部 同步的对象是 线程被打断了?像 示例代码。
  2. 我还可以通知其他主题吗? 拿着被打断的线程 宾语?就像示例代码一样。

4 个答案:

答案 0 :(得分:1)

  

可以中断同步块内的线程,其同步的对象是要中断的线程吗?与示例代码中一样。

是。我不明白为什么那不起作用。 synchronized关键字与interrupt方法非常正交。 (请注意,与awaitnotify相反,您在调用interrupt时拥有对象监视器需要 。)

  

我是否仍然可以通知其他持有被中断线程对象的线程?与示例代码中一样。

是的,只要您拥有对象监视器,就可以在任何对象上调用notifyAll。同样,wait/notify - 机制与interrupt方法非常正交。


您的问题似乎表明您误解了synchronized的使用。通常的用例是在表示您希望避免并发访问的某个资源的对象上进行同步。 线程本身很少代表这样的资源。

答案 1 :(得分:0)

该对象正常工作。唯一的规定是在threadObject的监视器上同步的其他线程将阻塞,直到您完成线程。所以是的,你可以做到这两点。

答案 2 :(得分:0)

  1. 是的:但是在调用中断之前你根本不需要锁定。

答案 3 :(得分:0)

这两个问题的答案都是肯定的。

但是,你的例子有点奇怪。我从未遇到过使用Thread作为原始锁的情况。而你在这个例子中所做的事情似乎并没有取得任何成就。

  • 如果threadObjectThread.currentThread()相同,则对interrupt()的调用只会设置此线程的中断标志...在该代码片段中会被注意到。< / p>

  • 如果threadObject是其他Thread个对象,则该线程将被中断。但我们看不到(这里)该线程将执行的代码,我们不知道它是否会等待threadObject。如果不是interrupt()notify()井有不同的线程......

底线是您通常不会将Thread对象用作锁,并且通常不会使用interrupt()作为 ersatz notify()。

(也许这个例子不是为了代表一个真实的用例。)