我没想到它会起作用,但是期货实际上是可以取消的(但是为什么呢?)。@Tarun
Lalwani提到Google的Guava库的TimeLimiter之后,我检查了一下代码,在示例中进行了尝试(可行!)并将其重写一下-
使它不是基于时间的,而是基于方法调用的?
这是我从研究中得到的结果:的包装器
BufferedReader:
public class CancelableReader extends BufferedReader { private final ExecutorService executor; private Future future; public CancelableReader(Reader in) { super(in); executor = Executors.newSingleThreadExecutor(); } @Override public String readLine() { future = executor.submit(super::readLine); try { return (String) future.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } catch (CancellationException e) { return null; } return null; } public void cancelRead() { future.cancel(true); }}
这
class使您可以
BufferedReader#readLine()在需要时使用,并在想要继续/中断
Thread其运行时取消它。以下是一些实际的示例代码:
public static void main(String[] args) { System.out.println("START"); CancelableReader reader = new CancelableReader(new InputStreamReader(System.in)); String line; new Thread(() -> { try { Thread.sleep(10000); reader.cancelRead(); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); while ((line = reader.readLine()) != null) { System.out.println(line); } System.out.println("END");}
和它的输出:
START> Hello World!Hello World!> What's up?What's up?END //Exactly after 5 seconds, when the cancel was called> Hey, you still there?//No output as expected
我要说的最后一件事是 为什么这样做而不关闭InputStream或为每个进程创建一个线程?
在这种情况下,
InputStream是的流
Process,这意味着我们无法将其关闭。一种方法是取消阻塞
readLine()并返回null以完成
while-loop,但这是通过进行的
Reflection,它现在不如我们的解决方案那么漂亮,并且由于任何原因均无法正常工作。该应用程序使用许多进程,但用户数量有限-
这就是为什么我们决定每个用户而不是每个进程确定线程数量的原因。
我希望你们将来会发现这个主题,对您有帮助。如果您留下支持,那将很棒,所以我可以找回我的赏金代表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)