Javaマルチスレッド実現(Callableインターフェース)

4380 ワード

一、Runnableインターフェースを使用して実現されるマルチスレッドを定義することで、シングル継承の限界は回避できるが、操作結果に戻ることができず、Callableインターフェースが現れた。
@FunctionalInterface
public interface Callable {
    public V call() throws Exception;
}
call方法はスレッドの本体機能を実行した後、結果を返すことができ、リターンインターフェースのタイプはCallableインターフェース上の汎型によって決定される。
二、起動スレッドjava.util.co ncurrent.FuturreTask類、このクラスは主にCallableインターフェースオブジェクトの操作を担当しています。この種類の定義構造は以下の通りです。
public class FutureTask<V> extends Object implements RunnableFuture<V>
FutureTask類には次のような構造があります。
public FutureTask(Callablecallable)
public interface RunnableFuture<V> extends Runnable,Future<V>
Callable受信対象は、callメソッドの返却結果を取得するためです。
public class MyThread implements Callable<String>    {
    private int ticket = 10;

    @Override
    public String call() throws Exception {
        for(int x = 0 ;x < 10 ;x ++) {
            if(this.ticket > 0) {
                System.out.println("  ,ticket = " + this.ticket --);
            }
        }
        return "    ";
    }



}
public class TestDemo {

    public static void main(String[] args) throws Exception {
        MyThread mt1 = new MyThread();
        MyThread mt2 = new MyThread();
        FutureTask task1 = new FutureTask(mt1);
        FutureTask task2 = new FutureTask(mt2);//  call()    
        //FutureTask Runnable    ,      Thread      task  
        new Thread(task1).start();//     
        new Thread(task2).start();
        //        ,  FutureTask    Future  get()    
        System.out.println("A       :" + task1.get());
        System.out.println("A       :" + task1.get());
    }

}
—————————————————まとめ:1、マルチスレッドの実現には、RunnableインターフェースとThread類起動の配合に重点を置いている。2、Callableインターフェースについて、違いは戻り結果として3、FutureTask類でCallableオブジェクトを受信する。また、FutureTaskはRunnableサブクラスであるので、したがって、FutureTaskオブジェクトは、Threadクラスに呼び出され、Thread種類のstart()方法でマルチスレッドを起動することができます。