【マルチスレッド】Callable,Runnable比較と使い方

4287 ワード

マルチスレッドプログラムを作成するのは、マルチタスクの同時実行を実現し、ユーザーとよりよく対話できるようにするためです.3つの方法があります
RunnableとCallableの違いは,(1)Callableで規定する方法はcall()であり,Runnableで規定する方法はrun()である.(2)Callableのタスクは実行後に値を返すことができ,Runnableのタスクは値を返すことができない(3)callメソッドは異常を投げ出すことができ,runメソッドは(4)Callableタスクを実行してFutureオブジェクトを得ることができ,非同期計算の結果を表す.計算が完了するかどうかを確認する方法を提供し、計算の完了を待機し、計算の結果を取得します.Futureオブジェクトでは、タスクの実行状況を把握したり、タスクの実行をキャンセルしたり、実行結果を取得したりできます.
1.Runnableインタフェースを実現してThreadスレッドを作成する:
手順1:Runnableインタフェースを実装するクラスを作成します.
class SomeRunnable implements Runnable{

    public void run(){

      //do something here

    }

}

手順2:クラスオブジェクトの作成:Runnable oneRunnable=new SomeRunnable()
ステップ3:RunnableによってThreadオブジェクトを作成する:Thread oneThread=new Thread(oneRunnable);
ステップ4:スレッドの開始:oneThread.start();
これで、スレッドの作成が完了しました.
注記:スレッドの実行プロセスは、コードoneThreadを実行するときに簡単です.start();を選択すると、oneRunnableオブジェクトのvoid run()が実行されます.方法、
このメソッドの実行が完了すると、スレッドは消滅します.
2、方法1と同様に、Callableインタフェースを実現することによってThreadスレッドを作成する:ここで、Callableインタフェース(一つの方法しかない)は以下のように定義する:
public interface Callable<V> {   

    V call() throws Exception;   

} 

手順1:Callableインタフェースを実現するクラスSomeCallable(略)を作成する.
ステップ2:クラスオブジェクトを作成する:CallableoneCallable=new SomeCallable();
手順3:CallableからFutureTaskオブジェクトを作成する:FutureTaskoneTask=new FutureTask(oneCallable);
注記:FutureTaskは、Callableを受け入れることで作成されたパッケージで、FutureとRunnableインタフェースを同時に実現します.ステップ4:FutureTaskからThreadオブジェクトを作成する:Thread oneThread=new Thread(oneTask);
ステップ5:スレッドの開始:oneThread.start();
これで、スレッドの作成が完了しました.
3.Threadクラスを継承してスレッドを作成する.
ステップ1:Threadクラスを継承するサブクラスを定義します.
class SomeThead extends Thraad{

    public void run(){

    }

}

手順2:サブクラスのオブジェクトを作成します.
      SomeThread oneThread = new SomeThread();
手順3:スレッドの開始:
      oneThread.start();
これで、スレッドの作成が完了しました.
注記:このスレッドの作成方法は、主に実行メカニズムの問題に関連し、プログラムのパフォーマンスに影響を与えるため、十分ではありません.
4、スレッドプールを通してスレッドを作成する:
手順1:スレッドプールの作成:
      ExecutorService pool = Executors.newCachedThreadPool();
手順2:RunnableオブジェクトまたはCallableオブジェクトを使用して、ExecutorServiceオブジェクトにタスクをコミットします.
      Future submit(Callable task);
注記:Futureは次のように定義されたインタフェースです.
public interface Future<T>{

    V get() throws ...;

    V get(long timeout, TimeUnit unit) throws ...;

    void cancle(boolean mayInterrupt);

    boolean isCancelled();

    boolean isDone();

}

これで、スレッドの作成が完了しました.
注記:スレッドプールはshutdown()を呼び出す必要があります.スレッドを閉じます.
5、イベント割当スレッドによって、プログラム内の既存のスレッドを直接使用する:
使用方法:EventQueueクラスの静的メソッドinvokeLater()を直接呼び出します.
      EventQueue.invokeLater(oneRunnable);
注記:EventQueueを呼び出します.invokeLater(oneRunnable);oneRunnableオブジェクトのrun()メソッドが直接実行されます