• category: swing folder: SingleThreadExecutor title: SwingWorkerを一スレッドづつ順番に実行する tags: [SwingWorker, ExecutorService, JTable, JProgressBar] author: aterai pubdate: 2019-06-10T16:52:22+09:00 description: JTableのセルに配置したJProgressBarを操作するSwingWorkerタスクを一つづつ順番に実行します。 image: https://drive.google.com/uc?id=1x3PqH08NWiKXBFZl355XaqHN5fyc1zEdrg

概要

JTableのセルに配置したJProgressBarを操作するSwingWorkerタスクを一つづつ順番に実行します。

サンプルコード

ExecutorService executor = Executors.newSingleThreadExecutor();
// ...
protected final void addActionPerformed() {
  int key = model.getRowCount();
  SwingWorker<Integer, Integer> worker = new BackgroundTask() {
    @Override protected void process(List<Integer> c) {
      if (isCancelled()) {
        return;
      }
      if (!isDisplayable()) {
        System.out.println("process: DISPOSE_ON_CLOSE");
        cancel(true);
        executor.shutdown();
        return;
      }
      c.forEach(v -> model.setValueAt(v, key, 2));
    }
   @Override protected void done() {
      if (!isDisplayable()) {
        System.out.println("done: DISPOSE_ON_CLOSE");
        cancel(true);
        executor.shutdown();
        return;
      }
      String text;
      int i = -1;
      if (isCancelled()) {
        text = "Cancelled";
      } else {
        try {
          i = get();
          text = i >= 0 ? "Done" : "Disposed";
        } catch (InterruptedException | ExecutionException ex) {
          text = ex.getMessage();
        }
      }
      System.out.format("%s:%s(%dms)%n", key, text, i);
      // executor.remove(this);
    }
  };
  model.addProgressValue("example", 0, worker);
  executor.execute(worker);
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、Executors.newSingleThreadExecutor()で作成した単一スレッド用のexecutorを使用して順番に一つづSwingWorkerを実行しています。



  • デフォルトのSwingWorkerは、10個のワーカ・スレッドを同時に実行可能
    • Swing - Maximum number of SwingWorker objects in a Swing app?
      public abstract class SwingWorker<T, V> implements RunnableFuture<T> {
        /**
         * number of worker threads.
         */
        private static final int MAX_WORKER_THREADS = 10;
      // ...
      executorService =
          new ThreadPoolExecutor(MAX_WORKER_THREADS, MAX_WORKER_THREADS,
                                 10L, TimeUnit.MINUTES,
                                 new LinkedBlockingQueue<Runnable>(),
                                 threadFactory);
      

参考リンク

コメント