`
vvggsky
  • 浏览: 65444 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Callable与Future

阅读更多
java.util.concurrent.Callable与java.util.concurrent.Future类可以协助您完成Future模式。Future模式在请求发生时,会先产生一个Future对象给发出请求的客户。它的作用类似于代理(Proxy)对象,而同时所代理的真正目标对象的生成是由一个新的线程持续进行。真正的目标对象生成之后,将之设置到Future之中,而当客户端真正需要目标对象时,目标对象也已经准备好,可以让客户提取使用。
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;

    }   

}




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();

        }        

    }

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics