Aritalab:Lecture/Programming/Java/Parallel2
From Metabolomics.JP
< Aritalab:Lecture | Programming | Java(Difference between revisions)
(Created page with "==Concurrentパッケージ== 非同期で多くの処理を行うときに便利なパッケージが java.util.concurrent です。簡単な使い方は * [http://www.techscore...") |
m (→Concurrentパッケージ) |
||
Line 4: | Line 4: | ||
* [http://jrm.stin.jp/index.php?itemid=111 落ちぶれプログラマの戯言] | * [http://jrm.stin.jp/index.php?itemid=111 落ちぶれプログラマの戯言] | ||
にあります。 | にあります。 | ||
− | ここでは 20 個のタスクを 4 スレッドで処理する例を紹介します。ThreadPoolExecutor の設定が面倒に見えますが [http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/ThreadPoolExecutor.html Java6 のAPI仕様] | + | ここでは 20 個のタスクを 4 スレッドで処理する例を紹介します。ThreadPoolExecutor の設定が面倒に見えますが [http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/ThreadPoolExecutor.html Java6 のAPI仕様] をみながらパラメータを設定して下さい。ここでは長さを指定しない LinkedBlockingQueue を用いていますが、プログラム中で実行するタスクの数を調節しています。また終了するには exec.shutdown() を呼ぶのを忘れずにおこなって下さい。 |
<pre> | <pre> |
Revision as of 09:21, 2 July 2012
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(); } }