2011-03-01 162 views
2

我同步線程的對象是這樣的:Java的線程問題

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

現在,我的問題是:

  1. 有可能中斷一個synchronized塊中的一個線程 其中 被同步的對象是要被中斷的 線程?如在 中的示例代碼。
  2. 我仍然可以通知其他線程 持有中斷線程的 對象嗎?就像在示例代碼中一樣。
+0

當你嘗試它時發生了什麼? –

回答

0

該對象正常工作。唯一的規定是在threadObject監視器上同步的其他線程將阻塞,直到完成線程。所以是的,你可以做這兩件事。

1

有可能中斷同步塊中的線程,其同步對象是要中斷的線程?就像在示例代碼中一樣。

是的。我看不出爲什麼這是行不通的。​​關鍵字與interrupt方法非常正交。 (請注意,違反awaitnotify,你自己的對象監控不需要調用interrupt時。)

我還可以通知其他線程持有中斷線程的對象?就像在示例代碼中一樣。

是的,只要您擁有對象監視器,您可以在任何對象上調用notifyAll。同樣,wait/notify-機制與interrupt方法非常正交。


您的問題似乎表明您誤解了​​的使用。通常的用例是在一個代表某些資源的對象上進行同步,這些資源是你喜歡避免併發訪問的。 線程本身很少代表這樣的資源。

0
  1. 是的:但是在調用中斷之前你並不需要鎖定。
0

這兩個問題的答案都是肯定的。

但是,你的例子有點奇怪。我從來沒有遇到過使用Thread作爲原始鎖的情況。而且你在這個例子中所做的事情似乎沒有成就。

  • 如果threadObject相同Thread.currentThread(),然後調用interrupt()將只設置該線程的中斷標誌......這代碼片段被注意到。

  • 如果threadObject是其他Thread對象,那麼該線程將被中斷。但是我們不能看到(這裏)該線程將執行的代碼,我們不知道它是否會在threadObject上等待。如果不是interrupt()notify()也得到了不同的線程...

的底線是,你通常不會使用線程對象的鎖,你通常不會使用發送中斷( )作爲ersatz notify()。

(也許這個例子並不打算代表一個真實的使用案例。)