2016-01-29 50 views
1

我有一个异步的资源,我想使其自动关闭。我的资源旋转了一个线程并轮询内部读者。我应该阻塞Java中的异步AutoClosable资源的close方法吗?

我应该在close方法阻止,直到内部资源是封闭的还是确定。

我的代码是这样的......

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() 
    } 
} 
+0

在我看来,是的,它应该阻止。 close()不应该返回,除非一切都关闭。 – VGR

回答

1

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

+0

这就是我目前正在做的事情,但@morido正在做一个很好的论点,任何想法? – hba

+0

'AutoCloseable'不指定阻塞语义。 @莫多多表示自己没有义务抛出任何异常,这似乎完全无效。但是你的设计真的是错的。你的方法都应该提供'期货',以后可以询问,或者有异步回调,或者两者都有。例子见'AsynchronousSocketChannel'。 – EJP

+0

有趣 - 我的实际实施启动需要回调。只是想确保我明白 - 我如何从close方法返回未来,重写AutoClosable? – hba

1

虽然可能有合理的例外,我会说,一般你应该close()阻塞。

理由: AutoCloseable的close()建议抛出一个通用异常。虽然没有义务抛出这样的例外(现在你没有这样做),但你基本上禁止自己在将来改变这种情况。通过使异步的内部逻辑close()不能传递关闭资源时可能发生的任何错误行为。

相关问题