当前位置: 首页 > 面试题库 >

如何从HttpsURLConnection创建Java非阻塞InputStream?

计弘
2023-03-14
问题内容

基本上,我有一个URL,当发布新消息时,该URL在聊天室中流xml更新。我想将URL转换为InputStream并继续读取它,只要保持连接并且没有发送Thread.interrupt()。我遇到的问题是,当有内容要从流中读取时,BufferedReader.ready()似乎不正确。

我正在使用以下代码:

BufferedReader buf = new BufferedReader(new InputStreamReader(ins));


String str = "";
while(Thread.interrupted() != true)
{
    connected = true;
    debug("Listening...");

    if(buf.ready())
    {
        debug("Something to be read.");
        if ((str = buf.readLine()) != null) {
            // str is one line of text; readLine() strips the newline character(s)
            urlContents += String.format("%s%n", str);
            urlContents = filter(urlContents);
        }
    }

    // Give the system a chance to buffer or interrupt.
    try{Thread.sleep(1000);} catch(Exception ee) {debug("Caught thread exception.");}
}

当我运行代码并将某些内容发布到聊天室时,buf.ready()永远不会变为true,从而导致行永远不会被读取。但是,如果跳过“
buf.ready()”部分而直接读取行,则它将阻止进一步的操作,直到读取行。

我如何a)使buf.ready()返回true,或者b)以防止阻塞的方式执行此操作?

预先感谢,詹姆斯


问题答案:

如何创建Java非阻塞 InputStream

你不能 您的问题体现了一个矛盾。Java中的流正在阻塞。因此,没有“不阻塞InputStream”之类的东西。

Reader.ready()当可以不阻塞地读取数据时,返回true。期。InputStreamsReaders正在封锁。期。这里的一切都按设计工作。如果您希望与这些API并发使用,则必须使用多个线程。或Socket.setSoTimeout()与它的近距离关系HttpURLConnection



 类似资料:
  • 问题内容: 我正在努力使自己在nodejs中创建非阻塞的繁重计算。请看以下示例(从其他内容中删除): 可以想象,如果我同时打开2个浏览器窗口,第一个将等待10秒,另一个将等待20秒,这与预期的一样。因此,在知道回调以某种方式是异步的情况下,我删除了睡眠并改为放置: 具有简单定义的功能: 那当然是行不通的…我也曾尝试定义一个EventEmitter并向其注册,但是例如,发射器的主要功能在发出“完成”

  • 我想用Tkinter创建一个非阻塞消息窗口。这是为了在另一个函数正在等待答复时显示等待消息。收到回复后,窗口可自动关闭。我设法在网上找到了一些信息,我做了以下工作: 当我将其作为主脚本执行时,这运行良好,但是当我在得到以下错误RuntimeError之后想要使用Tkinter运行另一个gui应用程序时:主线程不在主循环中 另外,当我在App.destroy()之后运行另一段代码时。然后应用程序窗口

  • 我试图实现从阻塞队列创建的Reactor通量,但不确定哪个操作符最适合我的用例? 我正在创建一个流式RESTendpoint,其中的响应是流量,需要不断从阻塞队列中发出消息,作为获取REST调用的响应。 我已经尝试过论坛和留档,只能找到从可迭代集合或响应数据源发起的Flux,但没有任何BlockingQueue的示例。

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser

  • Web 容器中的非阻塞请求处理有助于提高对改善 Web 容器可扩展性不断增加的需求,增加 Web 容器可同时处理请求的连接数量。servlet 容器的非阻塞 IO 允许开发人员在数据可用时读取数据或在数据可写时写数据。非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 S

  • Java Future对象用于获取由并行线程(执行器)执行的异步计算的结果。我们调用Future.get()方法并等待结果就绪。此示例显示了一种从Future检索结果的非阻塞方式。java实现java非阻塞未来。 在本例中,在并行执行完成后调用onSuccess()方法。问题在于onSuccess()方法未在主线程上运行。我想在主线程上执行onSuccess()方法。我怎样才能解决这个问题。谢谢