SwingWorker синхронизирует блокировку очереди методов или как? - PullRequest
1 голос
/ 29 ноября 2011

Теоретический вопрос.Если у меня есть два SwingWorkers и outputObject с методом

public void synchronized outputToPane(String output)

Если в каждом SwingWorker есть цикл, как показано:

//SwingWorker1
while(true) { 
     outputObject.outputToPane("garbage");
}
//SwingWorker2
Integer i=0;
while(true) {
     outputObject.outputToPane(i.toString());
     i++;
}

Как они будут взаимодействовать?метод outputToPane получает аргумент из одного потока и блокирует другой, пока он не завершится первым, или создает очередь задач, которые будут выполняться в полученном порядке, или какую-то другую опцию?

причина, по которой я спрашиваю:
У меня есть два потока, которые будут обрабатывать некоторые тяжелые числа: один с потоком данных, которые нельзя приостановить, а другой из файла.Я хотел бы, чтобы они оба вышли в центральную область обмена сообщениями, когда они достигнут определенных вех;однако я НЕ МОГУ рискнуть заблокировать поток данных, пока он ожидает, пока другой поток завершит вывод.Тогда я рискну потерять данные.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

synchronized только гарантирует взаимное исключение.Это не справедливо , что на практике означает, что ваши работники могут чередоваться весьма неплохо, или первый может получить преимущество и полностью блокировать второго до завершения, или что-то между.

См. Reentrantlock документы для получения дополнительной информации о справедливости.Может быть, вы могли бы рассмотреть возможность использования вместо synchronized.Возможно, еще лучшей альтернативой было бы использование очереди .

0 голосов
/ 29 ноября 2011

Я бы посоветовал вам иметь два выходных объекта в вашей области сообщений.Потому что, если один поток начинает изменять выходной ответ, то другому придется ждать его завершения.Даже если вы можете оптимизировать его, чтобы сделать его достаточно быстрым, фактическое отображение информации заставит ваши потоки замедлять друг друга с течением времени.

Хотя вы можете попытаться синхронизировать их, результат не всегда может быть на 100% безопасным

...