Обычно вы передаете параметры в поток.Запустите логику в фоновом режиме.А затем отправьте обратно любые изменения, которые вам нужно сделать, для любого из этих объектов или элементов пользовательского интерфейса в потоке пользовательского интерфейса, используя SwingUtilities.invokeLater ().Обычно я создаю простую утилиту, которая позволяет мне указать, что должно выполняться в фоновом потоке, а что - в потоке пользовательского интерфейса.SwingWorker - это то, что вы можете использовать, хотя я нахожу это чрезвычайно болезненным в использовании.Нечто простое, подобное этому:
new AsyncThread<Param,T>() {
public T executeInBackground( Param param ) {
// do something long running
T result = // do something long running;
return T;
}
public void executeOnUI( T result ) {
// update the UI here, or modify the model, etc.
}
}.execute( param );
AsyncThread будет выполнять метод executeInBackground () в другом потоке.Затем внутренне он будет отправлять обратно в поток пользовательского интерфейса, используя SwingUtilities.invokeLater ().Затем executeOnUI будет выполняться в потоке пользовательского интерфейса.Метод execute () может создать поток для выполнения в фоновом режиме, обработки исключений и т. Д.
Я бы позволил графическому интерфейсу, возможно, запустить поток, и позволил бы графическому интерфейсу передать его модель или любую часть, которая ему нужна, в тему.А не наоборот.Таким образом, пользовательский интерфейс может дать отзыв о том фоновом потоке, который работает.Но вы не можете позволить фоновому потоку касаться (записывать / изменять / изменять) членов этой модели, которые поток пользовательского интерфейса будет также читать / записывать одновременно.Поэтому, если вы планируете изменить модель в ответ на фоновый поток, опубликуйте ее обратно в поток пользовательского интерфейса, чтобы быть в безопасности.