Ven*_*esh 4 java multithreading threadpool grpc grpc-java
是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?
如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?
是否可以这样说 - java gRPC 服务器线程即使在 DEADLINE 时间之后仍然会运行。
正确的。Java 不提供任何真正的替代方案。
但是,自从超过截止时间以来,gRPC 服务器只会停止/阻止该线程进行任何后续 gRPC 调用吗?
大多。传出 gRPC 调用会观察io.grpc.Context,这意味着截止日期和取消会被传播(除非您无法将 Context 传播到另一个线程或使用Context.fork())。
如果上述说法正确,那么有没有办法停止/阻止线程进行任何 Redis/DB 调用以及超过 DEADLINE 时间的线程?或者一旦超过 DEADLINE 时间,立即中断线程?
您可以通过 监听 Context 取消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)
| 归档时间: |
|
| 查看次数: |
2011 次 |
| 最近记录: |