Callable和future的使用

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

下面是一个简单的demo

static ExecutorService executorService = Executors.newFixedThreadPool(10);

public static void main(String[] args) {

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

    int sum = 0;
    for(Future 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{

      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

你可能感兴趣的:(java)