首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发框架的提交方法

Java并发框架的提交方法
EN

Stack Overflow用户
提问于 2016-06-01 19:26:44
回答 2查看 265关注 0票数 2

新的提交Java并发框架的方法。想知道当我调用submit还是调用get时线程是否被执行?研究了甲骨文的官方文件,但找不到太多的信息。谢谢。

我指的是下面的样本,

http://www.vogella.com/tutorials/JavaConcurrency/article.html

代码语言:javascript
复制
package de.vogella.concurrency.callables;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableFutures {
  private static final int NTHREDS = 10;

  public static void main(String[] args) {

    ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
    List<Future<Long>> list = new ArrayList<Future<Long>>();
    for (int i = 0; i < 20000; i++) {
      Callable<Long> worker = new MyCallable();
      Future<Long> submit = executor.submit(worker);
      list.add(submit);
    }
    long sum = 0;
    System.out.println(list.size());
    // now retrieve the result
    for (Future<Long> future : list) {
      try {
        sum += future.get();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (ExecutionException e) {
        e.printStackTrace();
      }
    }
    System.out.println(sum);
    executor.shutdown();
  }
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-01 19:38:16

不,调用submit并不能执行任务。调用get并不能执行任务。任务在属于执行器线程池的线程中异步处理。

调用submit方法将任务分配给线程池。任务将排队,直到池中的一个线程空闲为止。然后,池将任务分配给工作线程,后者调用代码。

当您调用Future.get时,或者某个工作人员已经完成了您的任务,另一个工作人员正在处理您的任务,或者该任务仍然在排队等待员工可用。如果您的任务完成了,那么未来将返回可调用任务返回的值,否则调用未来的get方法将导致主线程阻塞,直到任务完成。

票数 6
EN

Stack Overflow用户

发布于 2016-06-01 19:38:23

方法submit()将您的任务提交给线程池,而Future#get()则让当前线程等待任务由池中的一个线程执行,不管它是否失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37577213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档