2013-12-08 2 views
1

Я просто просматриваю курс Java и за несколько недель до того, как мы прошли многопоточность, где объяснили, что, когда два (или более) потока работают с одним и тем же объектом, объект должен быть заблокирован со всех сторон, кроме тех, которые работают с ним.Два потока, пишущие на тот же JTextArea

Наличие графического интерфейса Я хочу записать некоторые данные из 2 потоков в JTextArea, если я беспокоюсь о блокировке объекта, когда один поток пишет на него, или это обрабатывается уже JTextArea? Если мне стоит потрудиться, как мне это сделать, так как я не могу объявить Lock внутри определения класса JTextArea? Если я не буду беспокоиться об этом, останется ли он одинаковым со всем объектом swing, если нет, то какие исключения?

+0

[проверить этот ответ] (http://stackoverflow.com/questions/2899682/unresponsive-threading-involving-swing-and-awt-eventqueue/20359861#20359861), где я расскажу о графическом интерфейсе с использованием 'SwingUtilites' для отправки задачи рендеринга GUI в EventQueue, которая должна выполняться в EDT (поток отправки событий). Если это произойдет до того, как для отображения текста потребуется отношение, вы можете поместить этот код вызова в синхронизированную функцию, но измерение должно быть выполнено, как описано. – Sage

ответ

3

По большей части Swing по своей сути не является потокобезопасным, поэтому вы не можете этого сделать - вы должны обновить все компоненты GUI из EDT, завернув вызов в SwingUtilities.invokeLater(). Например:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     textArea.setText("Blah"); 
    } 
}); 

Хотя есть технически исключения из этого правила с несколькими избранными компонентами, я бы до сих пор далеко предпочитают выполнять все на EDT, если не очень хорошая причина, в противном случае (очень, очень редко кейс.)

+0

Не могли бы вы объяснить, как и \ или почему упаковка делает трюк? Я не вижу, как это соотносится с моими предыдущими знаниями о многопоточности. –

+0

Связана ли оболочка с методом '.setText', т. Е. Если в моем случае' run() 'вызывает другой метод, который на самом деле делает запись, я должен по-прежнему переносить' run() 'или метод, который включает фактическое письмо в объект? –

+3

Эта обертка не выполняет то, что вы сразу же помещаете в метод 'run()' в текущем потоке, и ставит в очередь выполнение потока потока событий (один поток, предназначенный для выполнения всех методов, относящихся к компонентам GUI.) Вместо того, чтобы говорить «текущая тема, сделайте это сейчас», вы говорите «эй, поток, который безопасно выполняет GUI-файл, назовите этот метод, когда вы будете свободны что-то делать» – berry120

3

В Swing вам необходимо обновить компоненты графического интерфейса только из потока пользовательского интерфейса. Таким образом, вы должны планировать эти обновления из своих потоков для выполнения в потоке пользовательского интерфейса.

This is one example с SwingUtilities.invokeLater().

Смежные вопросы