Home > Java > 並行プログラミング J2SE5.0の新機能

KENスクールはITエンジニア・Web/DTP・オフィスPCの専門パソコンスクール

並行プログラミング J2SE5.0の新機能

  • Posted by: kenschool
  • 2009年5月 8日 20:02
  • Java

講座でとりあげているJ2SE 5.0の主な追加機能は、

  • Generics
  • 拡張for文
  • Auto-Boxing Un-Boxing
  • Enum

などですが、今回は並行プログラミング用ライブラリである
Executorを紹介していきます。

 
Executorは複数のタスク(並行実行の単位)を並行して実行する際に利用する
フレームワークとして追加されたインターフェースです。
 

java.util.concurrentパッケージにはExecutorの他、このインターフェースを
継承したインターフェースと及び実装したクラスが含まれています。 

これらの追加機能によりThreadをより柔軟に扱うことができます。


 まずは従来通りのThreadの生成の仕方を確認しましょう。 
 Threadを生成するには2通りの方法がありました。
 

  1. Threadクラスを継承したクラスでrunメソッドをオーバーライドしその
    クラスをインスタンス化する
  2. Runnableインターフェースを実装したクラスでrunメソッドをオーバーライド
    し、Threadクラスをインスタンス化する際引数にその参照を渡す

 これらの方法は、RunnableインスタンスとThreadインスタンスが1対1の関係
つまり密な関係になっているためThreadの実装方法に依存したプログラム
の作成が必要であり、それは、スレッドの実行・制御をするプログラムが
複雑になってしまうという問題がありました。

ExecutorはRunnableインスタンスとThreadインスタンスの間に入り、 Runnableイン
スタンスの参照を受け取ってThreadインスタンスにその参照を渡します。 
 

このように間接的にRunnableインスタンスを実行することにより、
Threadインスタンスの実装方法に依存しない柔軟なプログラミングが
可能になってきます。 
 

つまり、RunnableインスタンスがどのThreadインスタンスで実行されるかは
Executorインターフェースの実装しているクラスの内容や
Executorインターフェースインスタンスの生成時の設定に依存しているということです。

 

以下はExecutorのシンプルなサンプルです。
 


RunnableObjは8桁の乱数を生成するRunnableインスタンスです。


ExecutorObj
インスタンスがThreadインスタンスに対し executeメソッドでRunnableインスタンス
を渡しています。

import java.util.concurrent.*;

class RunnableObj implements Runnable
{
    private StringBuffer sbf= null;

  public RunnableObj()
  {
    sbf = new StringBuffer();
  }

  public void run()
 {
   for(int i = 0;i<8;i++)
   {
    int num = (int)(Math.random()*10);

    sbf.append(Integer.toString(num));
   }
   System.out.println(Thread.currentThread().getName()+" : "+sbf+"\n");
  }
}


class ExecutorObj implements Executor
{
  private int num;

  public ExecutorObj(int num)
  {
   this.num = num;
  }

  public void execute(Runnable r)
  {
   Thread th = new Thread(r,"スレッド No."+num);

   th.start();
  }
}

public class ExeMain
{
  public static void main(String args[])
  {

   int thread_num = 5;

   for(int i=0;i    {
    Runnable rn = new RunnableObj();

    Executor ex = new ExecutorObj(i);

    ex.execute(rn);

   }
   System.out.println("End Main");
  }
}
 

ExecutorインターフェースだけではただRunnableインスタンスを渡している
だけなので図1の動作と変わりはありません。


しかし、Executorインターフェースを標準実装しているThreadPoolExecutor
クラスやScheduledThreadPoolExecutorクラスなど、
多数の並行プログラム用の機能があります。

また別な機会にご紹介していきますのでご期待ください。

--------------------------------------------------------------------------------

パソコンスクール KENスクール渋谷校 Programインストラクターhttp://www.kenschool.jp/school/shibuya/index.html


KENスクールでJavaを学びたい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html

トラックバック:0

TrackBack URL for this entry
http://it.kenblog.net/mt-tb.cgi/565
Listed below are links to weblogs that reference
並行プログラミング J2SE5.0の新機能 from KENスクールはITエンジニア・Web/DTP・オフィスPCの専門パソコンスクール

Home > Java > 並行プログラミング J2SE5.0の新機能

Search
Feeds

ページトップへ