java.util.concurrent

Executors

非同期での処理実行
全ての処理(タスク)を処理するには
一つ一つのタスクのためのスレッドを容易するのではリソースの浪費に
→起動済みスレッドの再利用
java.util.concurrent.Executor(JDK5.0~)で
 スレッドの再利用、スケジューリング、並列処理を実現

IF Executor.execute(Runnable)

ex
// 1つのスレッドで複数タスクを処理するExecutorの取得
Executor e = Executors.newSingleThreadExecutor();
Runnable r1 = ...
Runnable r2 = ...
e.execute(r1);// タスクの実行
e.execute(r2);

methods;
Executors.newSingleThreadExecutor()
→1つのスレッドで複数タスクを処理するExecutorの取得
newFixedThreadPool()
→指定した数のスレッドを作成+タスクの実行
newCachedThreadPool()
→必要に応じてスレッドを自動生成+タスク実行


ExecutorService
ExecutorのサブIF
状態追跡やタスク中断を担当

methods;
execute()
→Executor.execute()
submit() return Future
→タスクの実行結果/処理状態の取得
shutdown()
→実行済みのタスクの継続実行+新規タスクの受付拒否
shutdownNow()
→実行中タスクの処理中断+待機タスクの処理停止


■ThreadPool
プールしておいたスレッドで
キューに追加されたタスクを順次実行
するマルチスレッドの1形式
必要以上にスレッドを作成しないことで リソースの浪費を避ける

Executor.newSingleThreadExecutor()
担当タスクがある限り 順次タスクを処理する1スレッドを生成する。

ex: newSingleThreadExecutor()
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyTask implents Runnable {
 private String tab = "";

 public MyTask (int tab) {
  for (int i = 0; i <= tab; i++) {
   this.tab += " ";
  }
 }

 public void run() {
  for (int i = 0; i < 3; i++) {
   syso(tab + i);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {}
  }
 }

 public static void main(String[] args) {
  ExecutorService es = Executors.newSingleThreadExecutor();
  syso("[Sending Tasks...]");
  for (int i = 0; i < 3; i++) {
   es.execute( new MyTask( i*3 ) );
  }
  syso("[Finish Sending!]");
  ex.shutdown();
  syso("[ShutDown]");
 }
}


ex: newFixedThreadPool
public class MyTask ex PreviousMyTask impl Runnable {
 ...
 public static void main(String[] args) {
  ExecutorService es = Executors.newFixedThreadPool(2);// 使用するスレッドの数を指定
  syso("[Sending Tasks...]");
  for (int i = 0; i < 3; i++)
   es.execute( new MyTask( i*3 ) );// 指定数のスレッドを使いまわして複数タスクを処理
  syso("[Finish Sending!]");
  es.shutdown();
  syso("[ShutDown]");
 }
}


ex: newCachedThreadPool
public class MyTask ex PreviousMyTask impl Runnable {
 private int n;
 public MyTask(int n) {
  this.n = n;
 }

 public static void main(String[] args) {
  syso("Task" + n + " Start");
  try {
   Thread.sleep(1000);// 1秒休み
  } catch (Exception e){}
  syso("Task" + n + " End");
 }

 public static void main(String[] args) {
  ExecutorService es = Executors.newCachedThreadPool();
  Thread.currentThread().getThreadGroup().list();
  syso("Sending Tasks...");
  for (int i = 0; i < 3; i++) {
   ex.execute(new MyTask(i));
   Thread.currentThread().getThreadGroup().list();
   try {
    Thread.sleep(600);
   } catch (Exception e) {}
  }
  es.shutdown();
 }
}
→実行可能スレッド(全担当タスク完了状態)がなければ新規スレッドを生成
 実行可能スレッドがあれば そいつが新規タスクを受理
 実行可能スレッドは 一定時間内に新規タスクを受けなかった場合 削除される

ref:
http://www.techscore.com/tech/J2SE/Thread/7.html

tag : java.util.concurrent Executor Executors ExecutorService newSingleThreadExecutor newFixedThreadPool newCachedThreadPool

2009-02-09 05:25 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud