彩虹天堂
          技術源于生活
          posts - 0,  comments - 2,  trackbacks - 0
          Callable 與 Future

          Callable與Future類別可以協助您完成 Future 模式

          Callable是個介面,與Runnable類似,有個必須實作的方法,可以啟動為另一個執行緒來執行,不過Callable工作完成後,可以傳回結果物件,Callable介面的定義如下:
          public interface Callable<V> {
              V call() throws Exception;
          }

          例如您可以使用Callable來完成某個費時的工作,工作結束後傳回結果物件,例如求質數:

          • PrimeCallable.java
          package onlyfun.caterpillar;

          import java.util.ArrayList;
          import java.util.List;
          import java.util.concurrent.Callable;

          public class PrimeCallable implements Callable<int[]> {
          private int max;

          public PrimeCallable(int max) {
          this.max = max;
          }

          public int[] call() throws Exception {
          int[] prime = new int[max+1];

          List<Integer> list = new ArrayList<Integer>();

          for(int i = 2; i <= max; i++)
          prime[i] = 1;

          for(int i = 2; i*i <= max; i++) { // 這邊可以改進
          if(prime[i] == 1) {
          for(int j = 2*i; j <= max; j++) {
          if(j % i == 0)
          prime[j] = 0;
          }
          }
          }

          for(int i = 2; i < max; i++) {
          if(prime[i] == 1) {
          list.add(i);
          }
          }

          int[] p = new int[list.size()];
          for(int i = 0; i < p.length; i++) {
          p[i] = list.get(i).intValue();
          }

          return p;
          }

          }

          假設現在求質數的需求是在啟動PrimeCallable後的幾秒之後,則我們可以搭配Future來取得Callable執行的結果,在未來的時間點取得結果,例如:
          • FutureDemo.java
          package onlyfun.caterpillar;

          import java.util.concurrent.Callable;
          import java.util.concurrent.ExecutionException;
          import java.util.concurrent.FutureTask;

          public class FutureDemo {
          public static void main(String[] args) {
          Callable<int[]> primeCallable = new PrimeCallable(1000);
          FutureTask<int[]> primeTask = new FutureTask<int[]>(primeCallable);

          Thread t = new Thread(primeTask);
          t.start();

          try {
          // 假設現在做其它事情
          Thread.sleep(5000);

          // 回來看看質數找好了嗎
          if(primeTask.isDone()) {
          int[] primes = primeTask.get();
          for(int prime : primes) {
          System.out.print(prime + " ");
          }
          System.out.println();
          }
          } catch (InterruptedException e) {
          e.printStackTrace();
          } catch (ExecutionException e) {
          e.printStackTrace();
          }
          }
          }
          posted on 2008-08-05 09:14 bcterry 閱讀(222) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 灵武市| 安仁县| 区。| 宁城县| 涞水县| 曲阳县| 西充县| 临澧县| 攀枝花市| 祁门县| 黄冈市| 故城县| 偃师市| 临海市| 久治县| 万全县| 黄骅市| 松溪县| 库伦旗| 桦川县| 浮山县| 陈巴尔虎旗| 晋城| 夹江县| 南江县| 平邑县| 都匀市| 武强县| 富顺县| 西华县| 巴林左旗| 诸暨市| 台山市| 赤峰市| 荆门市| 任丘市| 塘沽区| 连州市| 昌江| 滨州市| 紫阳县|