2011-06-22 55 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

我已经解决了这个问题,为程序的每个部分创建单独的线程并交换它们之间的锁。