2013-02-27 68 views
4

我知道LockSupport是JDK的一部分,但我想知道下面的實現是否在語義上是正確的。觀察Object.wait可以處理線程中斷的問題。我的問題不在於表現;不過,只要您的解決方案只使用基本架構(如等待,通知和同步),我將非常感謝任何改進我的解決方案的建議。我可以在純Java中實現park/unpark方法嗎?

非常感謝。

final class LockSupport { 
    static void park(long time) { 
     Thread th = Thread.currentThread(); 
     if (th instanceof MyThread) { 
      MyThread h = (MyThread)th; 
      synchronized (h.obj) { 
       if (h.permit) { 
        h.permit = false; 
        return; 
       } 
       try { 
        h.obj.wait(time); 
       } catch (InterruptedException e) { } 
      } 
     } 
    } 

    static void unpark(MyThread h) { 
     synchronized (h.obj) { 
      h.permit = true; 
      h.obj.notify(); 
     } 
    } 
} 

abstract class MyThread extends Thread { 
    public Object obj = new Object(); 
    public boolean permit = true; 
} 
+0

你應該等待一個循環來處理虛假喚醒。 – assylias 2013-02-27 23:27:44

+2

不,該文件指出園區可能因虛假情況而返回。 – 2013-02-28 09:37:17

回答

2

最初的許可證應該是錯誤的。

當中斷被抓住了,你需要重新中斷當前線程

catch (InterruptedException e) { th.interrupt(); } 

,因爲如果由於park()返回到中斷,中斷狀態應設置(見javadoc的例子)

wait()由於中斷而正常或突然地完成,消耗許可證。

unpark(),如果permit已經爲true,則不需要通知。

+0

你是對的;然而,在你的和我的解決方案中,這種行爲並不等於OpenJDK的實現。 – 2013-02-28 10:06:35

相關問題