首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中停止在阻塞读操作中等待的线程?

如何在Java中停止在阻塞读操作中等待的线程?
EN

Stack Overflow用户
提问于 2010-11-15 16:05:04
回答 7查看 21.5K关注 0票数 22

我有一个执行以下代码的线程:

代码语言:javascript
复制
public void run() {
    try {
        int n = 0;
        byte[] buffer = new byte[4096];
        while ((n = in.read(buffer)) != -1) {
            out.write(buffer, 0, n);
            out.flush();
        }
    } catch (IOException e) {
        System.out.println(e);
    }
}

其中inSystem.in。我怎样才能优雅地停止这样的线程?关闭System.in和使用Thread.interrupt似乎都不起作用。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-15 16:14:52

这是因为读取System.in (InputStream)是一个阻塞操作。

看这里,Is it possible to read from a InputStream with a timeout?

票数 8
EN

Stack Overflow用户

发布于 2010-11-15 17:10:40

你偶然发现了一个9岁的bug,没有人愿意修理它。他们说在this bug report中有一些变通方法。很可能,您需要找到其他方法来设置超时(忙碌等待似乎是不可避免的)。

票数 8
EN

Stack Overflow用户

发布于 2010-11-15 16:27:10

您可以使用available()方法(它是非阻塞的)来检查是否有要预先读取的内容。

在伪java中:

代码语言:javascript
复制
//...
while(running)
{
    if(in.available() > 0)
    {
        n = in.read(buffer);
        //do stuff with the buffer
    }
    else
    {
        Thread.sleep(500);
    }
}
//when running set to false exit gracefully here...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4182491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档