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

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

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

sg3maiej

sg3maiej1#

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

  1. class CallableRunnable implements Runnable {
  2. private final Callable<?> callable;
  3. public CallableRunnable(Callable<?> callable) {
  4. this.callable = callable;
  5. }
  6. @Override
  7. public void run() {
  8. try {
  9. callable.call();
  10. } catch(Exception ex) {
  11. // some exception handling...
  12. }
  13. }
  14. }

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

  1. new CallableRunnable(someCallable)

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

展开查看全部

相关问题