Aritalab:Lecture/Programming/Java/Parallel2

From Metabolomics.JP
Jump to: navigation, search

Concurrentパッケージ

非同期で多くの処理を行うときに便利なパッケージが java.util.concurrent です。簡単な使い方は

にあります。 ここでは 20 個のタスクを 4 スレッドで処理する例を紹介します。ThreadPoolExecutor の設定が面倒に見えますが Java6 のAPI仕様 をみながらパラメータを設定して下さい。ここでは長さを指定しない LinkedBlockingQueue を用いていますが、プログラム中で実行するタスクの数を調節しています。また終了するには exec.shutdown() を呼ぶのを忘れずにおこなって下さい。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadTest {
  BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(4);
  ThreadPoolExecutor exec = new ThreadPoolExecutor(4 /* corePoolSize */,
      4 /* maxPoolSize */, 0 /* keepAliveTime */, TimeUnit.MILLISECONDS, queue);

  class Task extends Thread {
    int id;
    Task(int x) { id = x; }
    public void run() {
      try {
        Thread.sleep((int) (Math.random() * 1000));
      } catch (Exception e) {}
    }
  }

  void report() {
    System.out.println(exec.getTaskCount() + " tasks" + " (active:"
        + exec.getActiveCount() + " queue:" + queue.size() + ")");
  }

  void test() {
    System.out.println("START");
    try {
      for (int i = 0; i < 20;) {
        if (queue.remainingCapacity() > 0) {
          exec.execute(new Task(i));
          i++;
        } else {
          report();
          Thread.sleep(500);
        }
      }
    } catch (Exception e) {} finally { exec.shutdown(); }
    
    while (!exec.isTerminated()) {
      report();
     try { Thread.sleep(1000); } catch(Exception e) {}
    }
    System.out.println("FINISH");
  }

  public static void main(String[] args) {
    ThreadTest T = new ThreadTest();
    T.test();
  }
}
Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox