gpt4 book ai didi

java - 如何避免写入太多数据输出而阻塞线程?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:30 24 4
gpt4 key购买 nike

在一个由线程池运行的任务中,我想写一堆字符串到远程,并且有一个标志来指示任务是否已被取消。

我正在使用以下代码来确保我可以尽快停止:

public void sendToRemote(Iterator<String> data, OutputStream remote) {
try {
System.out.println("##### staring sending")
while(!this.cancelled && data.hasNext()) {
remote.write(data.next())
}
System.out.println("##### finished sending")
System.out.println("")
} catch(Throwable e) {
e.printStackTrace();
} finally {
remote.close();
}
}

我有时发现,如果我给这个方法一个非常大的数据(或无限迭代器),即使我稍后将 this.cancelled 设置为 true,它不能及时完成。代码似乎被阻塞了,过了很长时间(1分钟左右),会出现这样的错误:

java.net.SocketTimeoutException: write blocked too long

所以我猜可能是 remote.write 方法在要发送的数据过多时会阻塞自身,但远程没有及时使用它。虽然我将this.cancelled设置为true,但是该方法已经在remote.write(data.next())行中被阻塞了很长一段时间,所以它没有机会检查 this.cancelled 的值并跳过循环。相反,在很长一段时间后,它终于抛出了一个 SocketTimeoutException

我的理解对吗?如果是,如果要发送的数据太多,如何避免阻塞?

最佳答案

尝试简单地关闭远程 OutputStream。您的线程将以异常结束。

  1. 线程#1 忙于执行 sendToRemote();
  2. Thread#2 认为够了就关闭了 Remote 。 (假设OutPutStream 对象不是线程本地的,就像在全局引用某处)
  3. 线程#1 异常终止:)

EDIT I found this on the internet

启用逗留并将超时设置为一定秒数将导致对 Socket.Close 的后续调用阻塞,直到所有数据发送缓冲区中的内容已发送或超时已过。

关于java - 如何避免写入太多数据输出而阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30003711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com