Callable和future的使用

在java中,我们知道创建线程一般有2中方式,一种是继承Thread,一种是实现Runable接口。但是这两种方法都不能返回线程处理后果的结果,如果想要获取线程处理过后的结果,需要共享线程变量或线程间通信,这样一来就需要考虑各种线程安全的问题。而使用Callable和Future的方式就很好的解决了这个问题。

下面是一个简单的demo

static ExecutorService executorService = Executors.newFixedThreadPool(10);

public static void main(String[] args) {

    List<Future> futureList =new ArrayList<>();
    for(int i=0;i<10;i++){
        Future<Integer> future = executorService.submit(new  Task(i));
        futureList.add(future);
    }

    int sum = 0;
    for(Future<Integer> future : futureList){
        while (true){
            if(future.isDone() && !future.isCancelled()){

                try {
                    int result = future.get();
                    sum = sum + result;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }
    System.out.println("主线程结束,sum为:"+sum);

}

  static  class Task implements Callable<Integer>{

      private int i =0;

      public Task(int i) {
          this.i = i;
      }

      @Override
      public Integer call() throws Exception {

          Thread.sleep(1000);
          System.out.println("子线"+ i +"程结束");
          return i;
  }
}

运行结果如下:

子线4程结束
子线9程结束
子线5程结束
子线0程结束
子线8程结束
子线1程结束
子线3程结束
子线7程结束
子线2程结束
子线6程结束
主线程结束,sum为:45
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值