Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gRPC服务器是否可以立即回收超过期限的线程?_Java_Multithreading_Threadpool_Grpc_Grpc Java - Fatal编程技术网

Java gRPC服务器是否可以立即回收超过期限的线程?

Java gRPC服务器是否可以立即回收超过期限的线程?,java,multithreading,threadpool,grpc,grpc-java,Java,Multithreading,Threadpool,Grpc,Grpc Java,说-javagrpc服务器线程即使在截止时间之后仍将运行是正确的吗。但是,gRPC服务器将仅停止/阻止该线程进行任何后续gRPC调用,因为截止时间已经过了 如果上面的语句是正确的,那么有没有一种方法可以停止/阻止线程进行任何Redis/DB调用,因为截止时间已经过了?或者一旦过了截止时间,立即中断线程 说-javagrpc服务器线程即使在截止时间之后仍将运行是正确的吗 对。Java没有提供任何真正的替代方案 但是,gRPC服务器将仅停止/阻止该线程进行任何后续gRPC调用,因为截止时间已经过了

说-javagrpc服务器线程即使在截止时间之后仍将运行是正确的吗。但是,gRPC服务器将仅停止/阻止该线程进行任何后续gRPC调用,因为截止时间已经过了

如果上面的语句是正确的,那么有没有一种方法可以停止/阻止线程进行任何Redis/DB调用,因为截止时间已经过了?或者一旦过了截止时间,立即中断线程

说-javagrpc服务器线程即使在截止时间之后仍将运行是正确的吗

对。Java没有提供任何真正的替代方案

但是,gRPC服务器将仅停止/阻止该线程进行任何后续gRPC调用,因为截止时间已经过了

大部分。传出的gRPC调用遵循
io.gRPC.Context
,这意味着传播截止日期和取消(除非您未能将上下文传播到另一个线程或使用
Context.fork()

如果上面的语句是正确的,那么有没有一种方法可以停止/阻止线程进行任何Redis/DB调用,因为截止时间已经过了?或者一旦过了截止时间,立即中断线程

您可以通过
Context.addListener()
监听上下文取消。当截止日期到期时,如果客户端取消RPC,gRPC服务器将取消上下文。此通知是如何取消传出RPC的

我将注意到,在没有赛车的情况下执行线程中断有点复杂。如果您想要中断并且没有
未来
,我建议将您的工作包装在
FutureTask
(并在当前线程上简单地调用
FutureTask.run()
)中,以获得其非快速
取消(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);
final FutureTask future=新的FutureTask(工作,空);
Context current=Context.current();
CancellationListener=新建CancellationListener(){
@已取消覆盖公共无效(上下文){
future.cancel(true);
}
};
current.addListener(listener);
future.run();
当前.RemovelListener(侦听器);

您可以在进行Redis/DB查询之前进行检查,如果有,则抛出。

对于Java来说,情况仍然相同吗?它仍然有效。虽然它是特定于线程中断的。通常取消还有其他选项,如
ServerCallStreamObserver.setOnCancelHandler()
。谢谢。您能给我举一个例子吗?在这个例子中,当客户端的截止日期超过时,我可以期望服务器取消(手头的)工作。客户机当然会收到超过截止日期的错误。