美文网首页技术干货程序员
多线程之并行计算Callable、Future

多线程之并行计算Callable、Future

作者: 激情的狼王 | 来源:发表于2017-09-25 15:10 被阅读0次

    Runnable开启一个线程执行任务,任务的执行过程和结果我们都获取不到,很不方便,所以Callable出现了。

    Runnable和Callable的区别是:
    (1)Callable规定的方法是call(),Runnable规定的方法是run().
    (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
    (3)call方法可以抛出异常,run方法不可以
    (4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,Future.get()方法可能会阻塞当前线程的执行;

    例子:

    ExecutorService threadPool = Executors.newSingleThreadExecutor();
            Future<Integer> future = threadPool.submit(new Callable<Integer>() {
                public Integer call() throws Exception {
                    return new Random().nextInt(100);
                }
            });
           Int result = future.get();//阻塞
    利用这个可以实现并行计算:
    
    public class T07_ParallelComputing {
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            long start = System.currentTimeMillis();
            List<Integer> results = getPrime(1, 200000); 
            long end = System.currentTimeMillis();
            System.out.println(end - start);
            
            final int cpuCoreNum = 4;
            
            ExecutorService service = Executors.newFixedThreadPool(cpuCoreNum);
            
            MyTask t1 = new MyTask(1, 80000); //1-5 5-10 10-15 15-20
            MyTask t2 = new MyTask(80001, 130000);
            MyTask t3 = new MyTask(130001, 170000);
            MyTask t4 = new MyTask(170001, 200000);
            
            Future<List<Integer>> f1 = service.submit(t1);
            Future<List<Integer>> f2 = service.submit(t2);
            Future<List<Integer>> f3 = service.submit(t3);
            Future<List<Integer>> f4 = service.submit(t4);
            
            start = System.currentTimeMillis();
            f1.get();
            f2.get();
            f3.get();
            f4.get();
            end = System.currentTimeMillis();
            System.out.println(end - start);
            service.shutdown();
        }
        
        static class MyTask implements Callable<List<Integer>> {
            int startPos, endPos;
            
            MyTask(int s, int e) {
                this.startPos = s;
                this.endPos = e;
            }
            
            @Override
            public List<Integer> call() throws Exception {
                List<Integer> r = getPrime(startPos, endPos);
                return r;
            }
            
        }
        
        static boolean isPrime(int num) {
            for(int i=2; i<=num/2; i++) {
                if(num % i == 0) return false;
            }
            return true;
        }
        
        static List<Integer> getPrime(int start, int end) {
            List<Integer> results = new ArrayList<>();
            for(int i=start; i<=end; i++) {
                if(isPrime(i)) results.add(i);
            }
            
            return results;
        }
    }
    
    QQ图片20170925151136.png

    相关文章

      网友评论

        本文标题:多线程之并行计算Callable、Future

        本文链接:https://www.haomeiwen.com/subject/lcbrextx.html