|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Давайте запустим с задачи, которая является очень простой, но потенциально отнимающей много времени. апплет загружает ряд графических файлов, используемых в анимации. Если графические файлы загружаются из начального потока, может быть задержка прежде, чем GUI появится. Если графические файлы загружаются из события, диспетчеризируют поток, GUI может быть временно безразличным.TumbleItem
Избегать этих проблем, TumbleItem создает и выполняет экземпляр SwingWorker от его начальных потоков. Объект doInBackground метод, выполняющийся в рабочем потоке, загружает изображения в ImageIcon массив, и возвраты ссылка на это. Затем done метод, выполняясь в конечном счете диспетчеризирует поток, вызывает get получать эту ссылку, которую это присваивает названному полю class апплета imgs. Это позволяет TumbleItem создать GUI сразу, не ожидая изображений, чтобы закончить загружаться.
Вот код, который определяет и выполняется SwingWorker объект.
SwingWorker worker = new SwingWorker<ImageIcon[], Void>() {
@Override
public ImageIcon[] doInBackground() {
final ImageIcon[] innerImgs = new ImageIcon[nimgs];
for (int i = 0; i < nimgs; i++) {
innerImgs[i] = loadImage(i+1);
}
return innerImgs;
}
@Override
public void done() {
//Remove the "Loading images" label.
animator.removeAll();
loopslot = -1;
try {
imgs = get();
} catch (InterruptedException ignore) {}
catch (java.util.concurrent.ExecutionException e) {
String why = null;
Throwable cause = e.getCause();
if (cause != null) {
why = cause.getMessage();
} else {
why = e.getMessage();
}
System.err.println("Error retrieving file: " + why);
}
}
};
Все конкретные подклассы SwingWorker реализация doInBackground; реализация done является дополнительным.
Заметьте это SwingWorker универсальный class, с двумя параметрами типа. Первый параметр типа определяет тип возврата для doInBackground, и также для get метод, который вызывается другими потоками, чтобы получить объект, возвращенный doInBackground. SwingWorker's второй параметр типа определяет тип для промежуточных результатов, возвращенных, в то время как фоновая задача является все еще активной. Так как этот пример не возвращает промежуточные результаты, Void используется в качестве заполнителя.
Можно задаться вопросом, если код, который устанавливает imgs излишне усложняется. Почему делают doInBackground возвратите объект и использование done получать это? Почему не только имеют doInBackground набор imgs непосредственно? Проблема состоит в том что объект imgs обращается к, создается в рабочем потоке и используется, в конечном счете диспетчеризируют поток. Когда объекты совместно используются потоками таким образом, следует удостовериться, что изменения, произведенные в одном потоке, видимы к другому. Используя get гарантии это, потому что использование get создает происхождение перед отношением между кодом, который создает imgs и код, который использует это. Для больше на происхождении перед отношением, обратитесь к
Есть фактически два способа получить объект, возвращенный doInBackground.
SwingWorker.get без параметров. Если фоновая задача не заканчивается, get блоки, пока это не.get блоки, пока это не — если тайм-аут не истекает сначала, когда get броски java.util.concurrent.TimeoutException.Будьте осторожны, вызывая любую перегрузку get от события диспетчеризируют поток; до get возвраты, никакие события GUI не обрабатываются, и GUI "замораживается". Не вызывать get без параметров, если Вы не уверены, что фоновая задача полна или близко к завершению.
Для больше на TumbleItem пример, обратитесь к тому