![]() | tech note |
| 自分をリファクタリング中。 |
スレッディングフレームワークともいうべき、java.util.concurrent。
タスク処理は、Thread、synchronized、wait/notify/notifyAllなどをうまく組み合わせてプログラミングする必要がありました。これがなかなか理解するのも使うのも難しく、苦労した覚えがあります。
Java5からは、java.util.concurrentというステキなフレームワークが追加されており、スレッド処理が格段に扱いやすくなっています。
//スレッドプール内のスレッド数=2としたExecutorService
ExecutorService es = Executors.newFixedThreadPool(2);
//3スレッド実行する
for (int i = 0; i < 3; i++) {
es.submit(new RunnableTask());
}
es.shutdown();ExecutorService es = Executors.newCachedThreadPool();
CompletionService<String> cs = new ExecutorCompletionService(es);
//3スレッド実行する
for (int i = 0; i < 3; i++) {
cs.submit(new CallableTask());
}
es.shutdown();
//結果を取り出す
for (int i = 0; i < 3; i++) {
Future<String> f = cs.take();
String s = f.get();
System.out.println(s);
}ScheduledExecutorService ses = Executors.newScheduledThreadPool(3);
//1秒おきにRunnableTaskを実行
ScheduledFuture f1
= ses.scheduleAtFixedRate(new RunnableTask(), 0,
1, TimeUnit.SECONDS);
//10秒後に止める
ScheduledFuture f2 = ses.schedule(new Runnable() {
public void run() {
f1.cancel(true);
}
}, 10, TimeUnit.SECONDS);
f2.get();
ses.shutdown();Lock lock = new ReentrantLock();
lock.lock();
try {
//同期をとってアクセスする必要のある処理
}
finally {
lock.unlock();
}