Во-первых, String
является неизменным, поэтому его нельзя обновить. Однако другой объект, такой как компонент Swing, может содержать ссылку на String
, и эта ссылка может быть обновлена, чтобы указывать на другой String
. Это то, что обычно происходит, когда текст обновляется в графическом интерфейсе.
Если у вас есть четыре разных потока, которым необходимо обновить компонент Swing, например, чтобы отобразить другой String
, они должны сделать это, поставив задачу в очередь для запуска в одном потоке диспетчеризации событий, используя SwingUtilities
методы invokeLater
или invokeAndWait
, например,
SwingUtilities.invokeLater(new Runnable() {
public void run() {
myComponent.setText("New string");
}
};
Или в более сложном приложении вы можете обновить объект домена, который затем должен быть потокобезопасным, из каждого из этих четырех потоков, а затем отдельно обновить компонент Swing в EDT. На мой взгляд, создать потокобезопасный код нелегко. Я настоятельно рекомендую книгу Параллелизм Java на практике , но суть заключается в том, чтобы гарантировать, что только один поток за раз выполняет любую операцию, в которой рассматриваемый объект временно находится в несовместимом состоянии. Иногда это возможно при подходящем использовании существующих потоковобезопасных классов и атомарных операций, но может потребовать использования блокировки, обычно с помощью synchronized
методов или блоков.
Конечно, ничего из этого не имеет значения, если, как теперь кажется, у вас вообще нет четырех потоков, а только четыре обработчика событий, вызываемых в EDT.