停止扫描程序上阻塞的Java线程
这与这里的其他一些问题有关,但我还没有看到有帮助的答案。JWW编辑:根据评论,引用的重复doe未按预期或预期处理EOF 在本例中,main函数启动一个线程,该线程阻塞扫描仪的nextLine函数。然后我等待0.2秒,然后我想强制这个线程终止,即使没有键入任何内容。我无法让线程自行停止,除非按一个键以满足其扫描仪的要求停止扫描程序上阻塞的Java线程,java,multithreading,stream,blocked,Java,Multithreading,Stream,Blocked,这与这里的其他一些问题有关,但我还没有看到有帮助的答案。JWW编辑:根据评论,引用的重复doe未按预期或预期处理EOF 在本例中,main函数启动一个线程,该线程阻塞扫描仪的nextLine函数。然后我等待0.2秒,然后我想强制这个线程终止,即使没有键入任何内容。我无法让线程自行停止,除非按一个键以满足其扫描仪的要求 import java.util.*; class sandbox { public static void main(String[] args) {
import java.util.*;
class sandbox {
public static void main(String[] args) {
BlockingThread thread = new BlockingThread();
thread.start();
trySleep(200); // wait 0.2 s
thread.closeScanner(); // try to close the Scanner, to terminate the Thread
}
public static void trySleep(int time) {
try { Thread.sleep(time); }
catch (InterruptedException e) {}
}
static class BlockingThread extends Thread {
private Scanner scanner = new Scanner(System.in);
public void run() {
System.out.println("Running!");
scanner.nextLine();
System.out.println("Stopping!");
}
public void closeScanner() {
System.out.println("\tTrying to close the Scanner...");
scanner.close();
System.out.println("\tScanner is now closed.");
}
}
}
一些注意事项:
它肯定阻塞了扫描仪的底层流。如果您下载并运行此代码,它将在打印后立即停止尝试关闭扫描仪。。。如果删除对thread.closeScanner的调用,它将在运行后立即停止!
我看到一些答案声称我想调用线程的中断方法。但是这不起作用,因为线程被阻塞了。
我已经看到其他答案,声称我想关闭扫描仪正在读取的流。但这似乎不起作用,因为Scanner文档表明它的close方法关闭了底层流,所以这应该是我在上面的玩具代码中所做的。
我甚至愿意使用一种不推荐使用的方法,比如stop,但即使这样似乎也没有效果。
有什么想法吗?谢谢
如果你好奇的话,潜在的动机是为我学生的作业创建一个自动评分器。流最终将成为线程执行的进程的标准输出。但是我的一些学生会有无限循环,我希望线程在n秒后终止,即使进程还没有完成。所以死锁并不是一个真正的问题,因为我并没有在同步方面做太多工作。我认为扫描器对于这项工作来说是错误的工具 扫描操作可能会阻止等待输入 哦,更重要的是: 在没有外部同步的情况下,扫描仪对于多线程使用是不安全的
您应该使用此答案中的代码:线程不会停止!我刚刚编辑了原件以表明这一点。问题是下一行正在锁定扫描仪的输入流。我还不知道如何修复它。是的,我已经想出了很多办法。我将修改原始版本以表明这一点。谢谢你指出我在原始帖子中遗漏的一些小问题。这个问题与另一个问题基本相同,但给出的答案并不能解决问题,因为它无法检测到EOF。我不知道现在该去哪里寻求帮助,因为我没有声誉去评论另一个,让它再次活起来。有人能提出一条前进的道路吗?谢谢。@JimGarrison给出了Adam对我的回答的评论,也许这应该重新打开?你是对的,扫描仪是工作的错误工具。然而,另一个答案给出的解决方案不起作用。如果输入为空,它将永远休眠。底层BufferedReader无法区分EOF和稍后可能有更多数据的空流之间的区别。是在另一页继续对话还是在这一页继续对话更好?@AdamSmith 1它将被阻止,而不是永远。你关于BufferedReader的说法是胡说八道。当然,它可以分辨出区别。这里的问题与BufferedReader无关。在按下Ctrl/d或Ctrl/z之前,控制台没有EOF,因此没有区别。阻塞,而不是睡眠。你说得对。但我不明白BufferedReader如何区分EOF和没有数据等待的开放流。此问题已涵盖此问题:。如果你能想出一个办法,我很想听。