java—为什么spring threadpooltaskexecutor#createqueue在接受提交callable时将blockingqueue< runnable>指定为返回类型

u7up0aaq  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(342)

我试图重写spring threadpooltaskexecutorprotectedcreatequeue(int queuecapacity)方法,通过创建并返回priorityblockingqueue而不是默认值来定制它( LinkedBlockingQueue / SynchronousQueue ). 在这样做的过程中,我遇到的问题是,该方法是否需要创建并返回blockingqueue当 ThreadPoolTaskExecutor 如果底层 BlockingQueue 只能保持 Runnable ?
谢谢

sg3maiej

sg3maiej1#

这里真的没有问题。一 Callable 表示可以运行的一组代码,这些代码返回一个值并可能引发异常。如果我们忽略返回值,并以某种方式处理异常,那么它可以用作 Runnable !
例如:

class CallableRunnable implements Runnable {
  private final Callable<?> callable;

  public CallableRunnable(Callable<?> callable) {
    this.callable = callable;
  }

  @Override
  public void run() {
    try {
      callable.call();
    } catch(Exception ex) {
      // some exception handling...
    }
  }
}

现在我可以转换任何 Callable 变成一个 Runnable 这样地:

new CallableRunnable(someCallable)

当然,这实际上是如何做到的 ThreadPoolExecutor (这是什么 ThreadPoolTaskExecutor 是基于)要复杂得多。 submit 需要返回一个 Future ,所以它还需要 Package Callable 变成一个 Future ,以及 Runnable . AbstractExecutorService (哪个 ThreadPoolExecutor 继承自) Package Callable 她被送进了医院 submit 进入 FutureTask s、 你可以看看他们 run 如果你感兴趣的话,方法看起来像这里。它的结构基本上和我上面写的一样,只是更多 Future -关联逻辑与状态管理 Future .

相关问题