彩虹天堂
          技術源于生活
          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 閱讀(223) 評論(0)  編輯  收藏

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


          網站導航:
           

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

          留言簿

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 射阳县| 孝感市| 阜平县| 昔阳县| 汽车| 五峰| 砀山县| 日喀则市| 土默特右旗| 华亭县| 营口市| 桦南县| 德兴市| 沂水县| 大新县| 平南县| 泗水县| 丰城市| 肇源县| 武清区| 新疆| 碌曲县| 西和县| 冷水江市| 泰顺县| 昌平区| 深圳市| 肥乡县| 宁明县| 石柱| 梓潼县| 肃宁县| 武城县| 瑞丽市| 泰来县| 南靖县| 广汉市| 贡嘎县| 霍林郭勒市| 张掖市| 祁连县|