Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Stream_Blocked - Fatal编程技术网

停止扫描程序上阻塞的Java线程

停止扫描程序上阻塞的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) {

这与这里的其他一些问题有关,但我还没有看到有帮助的答案。JWW编辑:根据评论,引用的重复doe未按预期或预期处理EOF

在本例中,main函数启动一个线程,该线程阻塞扫描仪的nextLine函数。然后我等待0.2秒,然后我想强制这个线程终止,即使没有键入任何内容。我无法让线程自行停止,除非按一个键以满足其扫描仪的要求

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和没有数据等待的开放流。此问题已涵盖此问题:。如果你能想出一个办法,我很想听。