Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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中异步自动关闭资源的关闭方法吗?_Java_Multithreading - Fatal编程技术网

我应该阻止Java中异步自动关闭资源的关闭方法吗?

我应该阻止Java中异步自动关闭资源的关闭方法吗?,java,multithreading,Java,Multithreading,我有一个异步资源,我想让它自动关闭。我的资源派生出一个线程并轮询一个内部读取器 我应该在关闭内部资源之前阻止关闭方法,还是可以 我的代码是这样的 public class MyReader implements AutoClosable { ActualReader readerImpl = ...; public void close() { shutdownRequested.set(true); } public void start() {

我有一个异步资源,我想让它自动关闭。我的资源派生出一个线程并轮询一个内部读取器

我应该在关闭内部资源之前阻止关闭方法,还是可以

我的代码是这样的

public class MyReader implements AutoClosable {
   ActualReader readerImpl = ...;

   public void close() {
     shutdownRequested.set(true);
   }

   public void start() {
     while(!shutdownRequested) { 
       int someInt = readerImpl.poll(100); 
     }

     readerImpl.close()
   }
}

您的资源应该是异步的。因此,该方法不应阻塞。

Ẃ虽然这条规则可能有合理的例外,但我想说的是,一般来说,您应该在
close()
上进行阻止


理由:AutoCloseable建议抛出一般异常。虽然没有义务抛出这样一个异常(现在你没有这样做),但你本质上是在禁止自己在将来改变它。通过使
close()
的内部逻辑异步,您无法真正传递关闭资源时可能发生的任何错误行为。

在我看来,是的,它应该阻止。close()应该在关闭所有内容之前不会返回。这是我目前正在做的,但是@morido正在做一个很好的参数,有什么想法吗?
AutoCloseable
没有指定阻塞语义@莫里多表示,他没有义务抛出任何例外,这似乎使他的理由完全无效。但实际上你的设计有错。这两种方法都应该提供
未来
,可以稍后查询,或者具有异步回调,或者两者兼而有之。有关示例,请参见
AsynchronousSocketChannel
。只是想确保我理解-我如何从覆盖AutoClosable的close方法返回未来?嗯,你当然不能。。。我注意到它确实完成了所有的操作,所以也许我找错了方向。。。。但OTOH套接字关闭本身是异步的,除非您设置了一个正的延迟超时,所以这并不能真正证明什么。