java吧 关注:1,294,905贴子:12,828,298
  • 2回复贴,共1

问个关于Future的多线程问题哈,业务中遇到的,大神帮我看看。

取消只看楼主收藏回复

比如说我起了个线程池来分别处理事务,随便写了点伪代码哈。
List<Future<T>> resultList = new ArrayList<>();
taskLists.forEach(task->resultList.add(taskExecutor.submit(()->run(task))));
resultList.forEach(res->System.out.println(res.get(5,TimeUnit.SECONDS)));
然后重点来了,比如说我这个resList里面有20个future,然后所有任务都超时,是会阻塞20*5 100秒吗?


IP属地:中国香港1楼2019-07-23 18:32回复
    自己顶一哈


    IP属地:中国香港来自Android客户端2楼2019-07-23 18:40
    回复
      2026-01-17 14:29:48
      广告
      不感兴趣
      开通SVIP免广告
      下班回家写了个测试加上复习了一下源码,发现虽然.get是阻塞,但是不会影响下一个get继续执行。 此贴终结-----(果然贴吧只能水吗)
      import java.util.ArrayList;
      import java.util.List;
      import java.util.concurrent.*;
      public class test {
      public static void main(String[] args){
      long t1 = System.currentTimeMillis();
      test();
      System.out.println(System.currentTimeMillis()-t1);
      }
      private static void test(){
      ExecutorService pool = Executors.newFixedThreadPool(10);
      List<Future<String>> list= new ArrayList<>();
      for(int i =0;i<10;i++){
      list.add(pool.submit(()->{
      try {
      TimeUnit.SECONDS.sleep(5);
      //System.out.println(Thread.currentThread().getName()+"---");
      return Thread.currentThread().getName()+"---";
      } catch (InterruptedException e) {
      e.printStackTrace();
      }finally {
      return Thread.currentThread().getName()+"---";
      }
      }));
      }
      System.out.println(list);
      list.forEach(a-> {
      try {
      System.out.println(a.get());
      } catch (InterruptedException e) {
      e.printStackTrace();
      } catch (ExecutionException e) {
      e.printStackTrace();
      }
      });
      }
      }
      附上demo,各位不想写notify和wait的,用Future和get方法很舒服哈。


      IP属地:中国香港3楼2019-07-23 20:01
      回复