当前位置: 首页 > 知识库问答 >
问题:

如何从可调用接口返回未来对象(ExecutorService.Submit的内部工作)

干子瑜
2023-03-14

我试图了解在运行ExecutorService.Submit(可调用);时如何创建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); 
  }
}
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));

共有1个答案

陆仲渊
2023-03-14

最简单的方法是将可调用的代码封装在一个未来请求中:

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

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

 类似资料:
  • 我创建了一个接口,以便可以在对话和片段之间进行通信。 目标:当用户从对话框中选择任何内容时,应将其显示在文本视图中。 在这个界面中,我创建了一个界面方法,在主活动中调用,并传递用户在对话框中选择的值。与用户选择的值一起,在我的片段中,我创建了一个方法,将文本视图设置为该值。然而,每当我调用该方法时,它总是返回null。 我对日志进行了大量测试,发现通过我的方法传递的值不是空的,一切似乎都按照我想要

  • 我对类上的接口实现的理解是,接口类型引用实现接口的类的对象。 但是当我研究下面的代码片段在上面的代码中使用时… GetConnection(host,username,password)返回对对象的引用(类型为Connection),但DriverManager类中没有实现接口。谁能澄清我的这个疑问..?还是我漏掉了什么? 下面的代码段不能得到相同的东西 createStatement()应该返回

  • 问题内容: 我正在尝试使我的第一个ajax示例在我的MAMP上运行。我的ajax.html看起来像: 我的ajax.js看起来像: 我的ajax.php看起来像: 回声“你好世界”; 我从萤火虫中检测到响应标头: 响应标头 连接Keep-Alive 内容长度11 Content-Type text / html 日期2012年11月5日星期一18:57:46 GMT Keep-Alive超时= 5

  • 问题内容: 我正在尝试从call()返回2D数组,但遇到了一些问题。到目前为止,我的代码是: 这段代码会编译,这不会返回我的数组。我确定我可能使用了错误的语法,但是找不到任何好的示例。 编辑:改变了一点 问题答案: 添加到Joseph Ottinger的答案中,要传递要在Callable的call()方法中使用的值,可以使用闭包:

  • 我有一个定义一些函数的接口IFoo,一个实现IFoo和一些内部函数的抽象类FooBase,还有几个从FooBase派生的类Foo。 我还有一个类Bar,它应该从FooBase调用一个方法,但是它的参数作为IFoo传递。所以所有的东西都是这样的: 如前所述,这感觉不对,因为任何人都可能会出现,编写一个实现IFoo的类Baz并用它调用DoSomething将会失败。 我还发现了这个问题/解决了一个类似