戻り値を取得できるスレッド

89687 ワード

マルチスレッドプログラムを作成するのは、マルチタスクの同時実行を実現し、ユーザーとよりよく対話できるようにするためです.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 call() throws Exception;}手順1:Callableインタフェースを実装するクラスSomeCallable(略);
手順2:クラスオブジェクトを作成します.
      Callable oneCallable = new SomeCallable();
手順3:CallableからFutureTaskオブジェクトを作成します.
      FutureTask oneTask = 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()     {     //do something here     } }
手順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 {     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()メソッドが直接実行されます
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメータ化されたタイプで、1つの方法しかありませんcall
public interface Callable {
    V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callableは、最終的にStringを返す非同期操作(計算)を表します.
Runnbaleは非同期で実行されるタスクをカプセル化し,パラメータと戻り値のない非同期メソッドとして想像できる.CallableはRunnableと似ていますが、戻り値があります.Callableインタフェースはパラメトリックタイプで、一つの方法call()しかありません.
public interface Callable {
    V call() throws Exception;
}
タイプパラメータは、戻り値のタイプです.たとえば、Callableは、最終的にStringを返す非同期操作(計算)を表します.

  
  
  
  
  1. //  
  2. class PrimeCallable implements Callable<int[]> { 
  3.     private int max; 
  4.      
  5.     public PrimeCallable(int max) { 
  6.         this.max = max; 
  7.     } 
  8.      
  9.     @Override 
  10.     public int[] call() throws Exception { 
  11.         List<Integer> result = new ArrayList<Integer>(); 
  12.         for(int i = 2; i <= max; i++) { 
  13.             System.out.println("System is checking data " + i); 
  14.             if(isPrime(i)) { 
  15.                 result.add(i); 
  16.             } 
  17.         } 
  18.          
  19.         Integer[] iters = result.toArray(new Integer[]{}); 
  20.         int[] array = new int[iters.length]; 
  21.         int i = 0
  22.         for(Integer iter : iters) { 
  23.             array[i++] = iter; 
  24.         } 
  25.         return array; 
  26.     } 
  27.      
  28.     private boolean isPrime(int data) { 
  29.         try { 
  30.             Thread.sleep(5); 
  31.         } catch (InterruptedException e) { 
  32.             e.printStackTrace(); 
  33.         } 
  34.         for(int i = 2; i < ((int)Math.sqrt(data)+1); i++) { 
  35.             if(data % i == 0)  
  36.                 return false
  37.         } 
  38.         return true
  39.     } 

  
  
  
  
  1. Callable<int[]> primeCallable = new PrimeCallable(1000); 
  2.         FutureTask<int[]> ftask = new FutureTask<int[]>(primeCallable); 
  3.          
  4.         Thread t = new Thread(ftask); 
  5.         t.start(); 
  6.          
  7.         int[] result = null
  8.         System.out.println("Waiting for result....."); 
  9.         try { 
  10.             result = ftask.get(); 
  11.         } catch (InterruptedException e) { 
  12.             e.printStackTrace(); 
  13.         } catch (ExecutionException e) { 
  14.             e.printStackTrace(); 
  15.         } 
  16.          
  17.         for(int i = 0; result != null && i < result.length; i++) { 
  18.             if(i != 0 && i % 10 == 0) { 
  19.                 System.out.println(); 
  20.             } 
  21.             System.out.print(String.format("%1$-5s", result[i])); 
  22.         } 


  
  
  
  
  1. : 
  2. Waiting for result..... 
  3. System is checking data 2 
  4. System is checking data 3 
  5. System is checking data 4 
  6. System is checking data 5 
  7. System is checking data 6 
  8. System is checking data 7 
  9. .................................. 
  10. System is checking data 999 
  11. System is checking data 1000 
  12. 2    3    5    7    11   13   17   19   23   29    
  13. 31   37   41   43   47   53   59   61   67   71    
  14. 73   79   83   89   97   101  103  107  109  113   
  15. 127  131  137  139  149  151  157  163  167  173   
  16. 179  181  191  193  197  199  211  223  227  229   
  17. 233  239  241  251  257  263  269  271  277  281   
  18. 283  293  307  311  313  317  331  337  347  349   
  19. 353  359  367  373  379  383  389  397  401  409   
  20. 419  421  431  433  439  443  449  457  461  463   
  21. 467  479  487  491  499  503  509  521  523  541   
  22. 547  557  563  569  571  577  587  593  599  601   
  23. 607  613  617  619  631  641  643  647  653  659   
  24. 661  673  677  683  691  701  709  719  727  733   
  25. 739  743  751  757  761  769  773  787  797  809   
  26. 811  821  823  827  829  839  853  857  859  863   
  27. 877  881  883  887  907  911  919  929  937  941   
  28. 947  953  967  971  977  983  991  997