java - 如何从可调用接口(interface)返回 future 对象(executorService.submit 的内部工作)

标签 java multithreading threadpool executorservice java.util.concurrent

我试图了解在运行 executorService.submit(Callable);

时如何创建 future 对象

例如,假设我创建了一个线程池,我在其中传递了可调用的实现

class FactorialCalculator implements Callable<Long> { 
  private int number; 
  public FactorialCalculator(int number) { 
    this.number = number; 
  } 
  @Override 
  public Long call() throws Exception { 
        return (number*number); 
  }
}

我想返回 future 对象,这样我就可以从调用函数中获取返回值。我的自定义线程池看起来像 this

class MyThreadPool implements java.util.concurrent.Executor 
{
    private final java.util.concurrent.BlockingQueue<Callable> queue;

    public MyThreadPool(int numThreads) {
        queue = new java.util.concurrent.LinkedBlockingQueue<>();
        for (int i=0 ; i<numThreads ; i++) {
            new Thread(new Runnable(){
                @Override
                public void run() {
                    while(true) {
                        queue.take().call();
                    }
                }
            }).start();
        }
    }

    @Override
    public void submit(Callable command) {
        queue.put(command);
    }
}

现在如果我这样做

MyThreadPool mypool = new MyThreadPool(10);
mypool.submit(new FactorialCalculator(10));

我想提交方法以返回 future,这样我就可以检查线程是否已完成执行的返回值。我如何返回 future 的对象。

最佳答案

最简单的方法是将您的可调用对象包装在 FutureTask 中:

@Override
public <T> Future<T> submit(Callable<T> callable) {
    FutureTask<T> future = new FutureTask(callable);
    queue.put(future);
    return future;
}

当然,更简单的解决方案是使用 Executors.newFixedThreadPool 而不是自己重新实现它。

关于java - 如何从可调用接口(interface)返回 future 对象(executorService.submit 的内部工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40053468/

相关文章:

java hashMap<Integer,String> 碰撞

Java分布式任务

c++ - 不存在合适的构造函数来从 void 转换为 std :thread

java - 如何为Java并发应用制定优化场景?

php - PHP 中的并行处理 - 你是怎么做到的?

java - java.lang.Thread.State : WAITING (parking) 90%线程解析

c# - 线程和 lambda 表达式

java - 将 ZoneId 和时间戳转换为 java 8 中的格式化日期字符串,考虑夏令时

java - Mongodb IsoDate 以及微服务上 if-modified-since 的问题

java - 使用线程池查询远程数据库