Java作成スレッドの3つの方法とそれぞれの長所


1.Thread類を継承し、start方法を呼び出します。

 class MyThread extends Thread {
   //  run  ,     ,    run   
   public void run(){
     //System.out.println("");
   }
  
   public static void main(String[] args){
     Thread t1 = new MyThread();
        t1.start(); //    ,    run()  .
   }
 }
2.Runnableインターフェースのrun方法を実現し、その後、Thread類で包んでから、start方法を呼び出します。

 class TestThread implements Runnable{
  
   @Override
   public void run() {
     // implement run method here 
     //System.out.println("");
   }
  
   public static void main() {
     final TestThread obj = new TestThread();
     Thread t1 = new Thread(obj);
     t1.start();
   }
 
 }
3.Callableインターフェースのcall方法を実現し、CallableオブジェクトをFutureTask類で包む。そして、Thread類でFutureTask類を包み、start方法を呼び出します。コール方法には戻り値があります。

class MyCallable implements Callable {
  @Override
  public Integer call() throws Exception {
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
      sum += i;
    }
    return sum;
  }

  public static void main(String[] args) throws Exception {
    MyCallable mc = new MyCallable(); //    callable

    FutureTask oneTask = new FutureTask(mc); // FutureTask  
    Thread oneThread = new Thread(oneTask); // Thread  
    oneThread.start();
    System.out.print(oneTask.get()); //     
  }
}
CallableメソッドはJava 8の後、ラムダ表現の書き方をサポートします。FutureTaskクラスを作成できます。文はあまりくどくどしません。Callable方式には以下のいくつかの利点がある。
  • は、スレッド上の異常を捕捉することができる。
  • は、get方法によって戻り値を得ることができる。
  • get方法は、呼び出しスレッドが終了するまで現在のスレッドをブロックします。
  • は、スレッドの動作をキャンセルすることができる。
  • 以下のコードは、FutureTaskクラスの実行スレッドを使用して、異常な捕獲例を示す。
    
    FutureTask<Integer> task=new FutureTask<Integer>(()->{
      throw new Exception("     ");
    });
     
    new Thread(task).start();
     
    try {
      System.out.println(task.get());
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
    Java 6の後、スレッドを作成することによってスレッドを作成することができ、ExectorServiceのexecute方法を使用することができる。
    
     ExecutorService es = Executors.newCachedThreadPool();
     Runnable r = <your runnable here>;
     es.execute(r);
    RunnableインターフェースがThreadクラスの継承に対する優位性を実現する:
       (1)同じプログラムコードの複数のスレッドが同じリソースを処理する場合
       (2)Java単一継承による制限は避けることができる。
       (3)インタフェースでコードとスレッドを分離し、より明確にする。
       (4)Threadクラスを継承することにより、各スレッドには関連する一意のオブジェクトがあり、Runnableインターフェースが実現され、マルチスレッドは同じRunnableの例を共有することができる。
       (5)プログラムのロバスト性が強化され、コードは複数のスレッドに共有され、コードはデータと独立している。
    以上がJava作成スレッドの3つの方法とそれぞれの長所の詳細です。JAVA作成スレッドに関する資料は他の関連記事に注目してください。