2011-06-22 91 views
2

我正在編寫一個程序,它創建一個用戶輸入窗格,並且需要等待用戶在執行任何計算之前單擊「查詢」。目前,我正在使用ReentrantLock來執行此操作。可重入鎖定問題

input = new InputPanel(config, files, runLock); 
JScrollPane inputScroll = new JScrollPane(input); 

cySouthPanel.add("MyProgram", inputScroll); 
cySouthPanel.setSelectedIndex(cySouthPanel.indexOfComponent("MyProgram")); 

runLock.lock(); 
    try { 
     // do stuff 
    } 
    finally { 
     runLock.unlock(); 
    } 

我目前獲取輸入面板的構造函數的鎖,當用戶點擊「查詢」按鈕釋放,但是當它遇到runLock.lock()我上面的程序不會停止。任何想法爲什麼?

編輯:我的問題源於InputPanel與我上面描述的函數運行在同一個線程的事實。在這種情況下,lock()不會阻止。

我需要一種方法來等待程序等待InputPanel。會創建自己的線程是一個可行的選擇?

回答

3

編輯
這聽起來像你想要做的就是使用CountDownLatch。您將創建值爲1的鎖存器(new CountDownLatch(1))。然後等待。

CountDownLatch latch = new CountDownLatch(1); 
input = new InputPanel(config, files, latch); 
JScrollPane inputScroll = new JScrollPane(input); 

cySouthPanel.add("MyProgram", inputScroll); 
cySouthPanel.setSelectedIndex(cySouthPanel.indexOfComponent("MyProgram")); 

latch.await(); 

然後,在你的GUI代碼,你將需要一次按下按鈕來調用latch.countDown()

+0

這已經在InputPanel內完成了。不過,我還需要在InputPanel之外進行工作。 –

+0

@Alex,您在輸入面板之外意味着什麼? – jjnguy

+0

我正在用'main'方法編寫程序。當用戶單擊查詢按鈕時,輸入面板創建一個輸入對象並將其傳遞迴主方法。我需要在主要方法中用它做其他事情,但需要等待創建對象。 –

1

我已經解決了這個問題,爲程序的每個部分創建單獨的線程並交換它們之間的鎖。