gpt4 book ai didi

Java 定期唤醒阻塞线程

转载 作者:行者123 更新时间:2023-11-30 10:28:20 25 4
gpt4 key购买 nike

我有一个程序,其中有多个线程写入缓冲区,并且有一个线程从缓冲区读取并写入文件。缓冲区的实现方式是在缓冲区为空时尝试提取条目,导致线程阻塞(使用 wait())。该线程使用 BufferedStream 写入文件。目前我在每写入 10 次文件后刷新 BufferedStream。

while (true)
{
BufferEntry entry = buffer.getEntry(); // might block

logFile.printf("%s", entry);

++entriesWritten;

if (entriesWritten >= 10)
{
logFile.flush();
entriesWritten = 0;
}
}

但是,我想介绍一个用例,在该用例中写入 x 个条目 (x<10) 后,缓冲区长时间保持为空。我希望将在缓冲区中保留超过一定时间的条目写入文件。

我正在考虑一个定期唤醒以处理刷新的守护进程,但这样的守护进程将意味着多个线程将处理一个文件,这是不可取的。更不用说守护进程必须知道当前未刷新条目的写入时间......

我正在考虑使用中断方法并捕获 InterruptedException。但我担心这种方法并不完美,此外 - 写入文件时收到的中断可能会导致需要处理的不同类型的异常。

我还有一个想法是重载 Buffer 构造函数以接收一个额外的参数,这将使缓冲区等待指定的分钟数而不是永远等待。醒来后可以检查是否需要冲洗。我对这个解决方案的担忧是 Buffer 负担了一些不应该关心的事情,而且 wait 没有返回关于它解除阻塞的原因的指示。

有没有一种很好的方法来处理这种情况?

最佳答案

您可能需要查看 Condition

此类提供对象监控方法(waitnotifynotifyAll)的功能 - 它们称为 await , signalsignalAll 以避免名称与继承自 Object 的方法冲突。

您可能感兴趣的是方法 awaitNanos ,因为它允许您指定超时:

Causes the current thread to wait until it is signalled or interrupted, or the specified waiting time elapses.

另一方面,也许是一个简单的 Object.wait(long timeout)可能足以满足您的用例。

关于Java 定期唤醒阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44708767/

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