Aritalab:Lecture/Programming/Java/Parallel2
From Metabolomics.JP
< Aritalab:Lecture | Programming | Java(Difference between revisions)
m (→Concurrentパッケージ) |
m (→Concurrentパッケージ) |
||
| Line 27: | Line 27: | ||
} | } | ||
| − | void | + | void printStatus() { |
System.out.println(exec.getTaskCount() + " tasks" + " (active:" | System.out.println(exec.getTaskCount() + " tasks" + " (active:" | ||
+ exec.getActiveCount() + " queue:" + queue.size() + ")"); | + exec.getActiveCount() + " queue:" + queue.size() + ")"); | ||
| Line 40: | Line 40: | ||
i++; | i++; | ||
} else { | } else { | ||
| − | + | printStatus(); | |
Thread.sleep(500); | Thread.sleep(500); | ||
} | } | ||
| Line 47: | Line 47: | ||
while (!exec.isTerminated()) { | while (!exec.isTerminated()) { | ||
| − | + | printStatus(); | |
| − | try { Thread.sleep( | + | try { Thread.sleep(500); } catch(Exception e) {} |
} | } | ||
System.out.println("FINISH"); | System.out.println("FINISH"); | ||
Latest revision as of 09:23, 2 July 2012
[edit] 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 printStatus() {
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 {
printStatus();
Thread.sleep(500);
}
}
} catch (Exception e) {} finally { exec.shutdown(); }
while (!exec.isTerminated()) {
printStatus();
try { Thread.sleep(500); } catch(Exception e) {}
}
System.out.println("FINISH");
}
public static void main(String[] args) {
ThreadTest T = new ThreadTest();
T.test();
}
}