码上敲享录 > java高并发常见问题 > 使用CompletionService解决Future的get方法阻塞问题

使用CompletionService解决Future的get方法阻塞问题

上一章章节目录下一章 2018-08-27已有5740人阅读 评论(0)

使用CompletionService解决Future的get方法阻塞问题


解决方法:

CompletionService 的take()方法获取最先执行完的线程的Future对象。

1.测试方法

public static void main(String[] args) throws Exception {

CallableDemo callable = new CallableDemo(1,100000);

CallableDemo callable2 = new CallableDemo(1,100);

ThreadPoolExecutor executor = new

ThreadPoolExecutor(4, 5, 5L,

TimeUnit.SECONDS, new LinkedBlockingDeque());

        CompletionService csRef = new ExecutorCompletionService(executor);

        System.out.println("main 1 " +System.currentTimeMillis());

csRef.submit(callable);

csRef.submit(callable2);

System.out.println("main 2 " +System.currentTimeMillis());

System.out.println(csRef.take().get());

System.out.println("main 3 " +System.currentTimeMillis());

System.out.println(csRef.take().get());

System.out.println("main 4 " +System.currentTimeMillis());

}


2.线程类

import java.util.concurrent.Callable;

public class CallableDemo implements Callable<String> {

private int begin;

private int end;

private int sum;

public CallableDemo(int begin, int end) {

super();

this.begin = begin;

this.end = end;

}

public String call() throws Exception {

for(int i=begin;i<=end;i++){

for(int j=begin;j<=end;j++){

sum+=j;

}

}

Thread.sleep(8000);

return begin+"-" +end+"的和:"+ sum;

}

}


本文链接:http://www.yayihouse.com/yayishuwu/chapter/1546


向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
5

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交