繁体   English   中英

重入锁问题

[英]Reentrant Lock Problems

我正在编写一个程序,该程序创建用户输入窗格,并且需要等待用户单击“查询”才能执行任何计算。 目前,我正在使用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。 创建自己的线程是否可行?

编辑
听起来您想要做的是使用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()

我想知道这是否是时候了。 您可能会发现CountDownLatch( http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html )更适合您要执行的操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM