繁体   English   中英

Java线程问题

[英]Java Threading Issue

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

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

现在,我的问题是:

  1. 是否可以中断同步块内部的线程,该线程的同步对象是要中断的线程? 就像在示例代码中一样。
  2. 我是否仍可以通知其他持有被中断线程对象的线程? 就像在示例代码中一样。

是否可以中断同步块内部的线程,该线程的同步对象是要中断的线程? 就像在示例代码中一样。

是。 我不明白为什么这行不通。 synchronized关键字与interrupt方法非常正交。 (请注意,违反awaitnotify ,你给自己打电话时,物体监视所需的interrupt 。)

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

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


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

该对象将像往常一样工作。 唯一的规定是,在您完成线程处理之前,在threadObject的监视器上同步的其他线程将被阻塞。 所以是的,您可以同时做这两个。

  1. 是的:但是在调用中断之前,您确实不需要锁。

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

但是,您的示例有些奇怪。 我从未遇到过将Thread用作原始锁的情况。 而且您在示例中所做的事情似乎并没有取得任何成就。

  • 如果threadObjectThread.currentThread()相同,则对interrupt()的调用将只设置该线程的中断标志...,该代码段中会注意到该标志。

  • 如果threadObject是其他Thread对象,则该线程将被中断。 但是我们(在这里)看不到该线程将要执行的代码,并且我们也不知道它是否将在threadObject上等待。 如果不是,则好好将interrupt()notify()转到不同的线程...

最重要的是,您通常不会使用Thread对象作为锁,并且通常不会使用interrupt()作为ersatz notify()发送。

(也许此示例并非旨在表示真实的用例。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM