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
блоки, пока это не.SwingWorker.get
с параметрами, указывающими на тайм-аутget
блоки, пока это не — если тайм-аут не истекает сначала, когда get
броски java.util.concurrent.TimeoutException
.Будьте осторожны, вызывая любую перегрузку get
от события диспетчеризируют поток; до get
возвраты, никакие события GUI не обрабатываются, и GUI "замораживается". Не вызывать get
без параметров, если Вы не уверены, что фоновая задача полна или близко к завершению.
Для больше на TumbleItem
пример, обратитесь к тому