我正在编写一个创建用户输入窗格的程序,需要等待用户在执行任何计算之前单击“查询”。目前,我正在使用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();
}
我目前在InputPanel的构造函数中获取锁定,并在用户单击“查询”按钮时释放它,但我的程序在遇到上面的runLock.lock()
时不会停止。任何想法为什么?
编辑:我的问题源于这样一个事实:InputPanel在与我上面描述的函数相同的线程中运行。在这种情况下,lock()
不会阻止。
我需要一种等待程序等待InputPanel的方法。创建我自己的线程是否可行?
答案 0 :(得分: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()
。
答案 1 :(得分:1)
我想知道这是不是时间问题。您可能会发现CountDownLatch(http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html)更适合您想要做的事情。
答案 2 :(得分:1)
我通过为程序的每个部分创建单独的线程并在它们之间交换锁来解决这个问题。