gRPC 服务器可以立即回收 DEADLINE_EXCEEDED 线程吗?

Ven*_*esh 4 java multithreading threadpool grpc grpc-java

是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?

如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?

Eri*_*son 5

是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。

正确的。Java 不提供任何真正的替代方案。

但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?

大多。传出 gRPC 调用会观察io.grpc.Context,这意味着截止日期和取消会被传播(除非您无法将 Context 传播到另一个线程或使用Context.fork())。

如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?

您可以通过 监听 Co​​ntext 取消Context.addListener()。当截止时间到期并且客户端取消 RPC 时,gRPC 服务器将取消 Context。此通知是取消传出 RPC 的方式。

我会注意到,线程中断对于在不竞争的情况下执行有点复杂。如果您想要中断并且还没有Future,我建议将您的工作包装在 a 中FutureTask(并简单地调用FutureTask.run()当前线程)以获得其非活泼的cancel(true)实现。

final FutureTask<Void> future = new FutureTask<Void>(work, null);
Context current = Context.current();
CancellationListener listener = new CancellationListener() {
  @Override public void cancelled(Context context) {
    future.cancel(true);
  }
};
current.addListener(listener);
future.run();
current.removeListener(listener);
Run Code Online (Sandbox Code Playgroud)