Проблемы с реентрантным замком - PullRequest
2 голосов
/ 22 июня 2011

Я пишу программу, которая создает пользовательскую панель ввода и должна ждать, пока пользователь нажмет кнопку «запрос», прежде чем выполнять какие-либо вычисления. В настоящее время я использую 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. Будет ли создание моих собственных тем жизнеспособной альтернативой?

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Редактировать
То, что вы хотите сделать, это использовать 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 голос
/ 23 июня 2011

Я решил эту проблему путем создания отдельных потоков для каждой части программы и обмена блокировками между ними.

1 голос
/ 22 июня 2011

Интересно, не до ли это времени?Вы могли бы найти CountDownLatch (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html) более подходящим для того, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...