Java周期性地唤醒阻塞线程
我有一个程序,其中有几个线程写入缓冲区,有一个线程从缓冲区读取并写入文件。 缓冲区的实现方式是,当缓冲区为空时尝试提取条目,导致线程阻塞(使用wait())。 线程使用BufferedStream写入文件。 目前,我正在刷新缓冲流后,每10次的文件写入Java周期性地唤醒阻塞线程,java,multithreading,Java,Multithreading,我有一个程序,其中有几个线程写入缓冲区,有一个线程从缓冲区读取并写入文件。 缓冲区的实现方式是,当缓冲区为空时尝试提取条目,导致线程阻塞(使用wait())。 线程使用BufferedStream写入文件。 目前,我正在刷新缓冲流后,每10次的文件写入 while (true) { BufferEntry entry = buffer.getEntry(); // might block logFile.printf("%s", entry); ++entrie
while (true)
{
BufferEntry entry = buffer.getEntry(); // might block
logFile.printf("%s", entry);
++entriesWritten;
if (entriesWritten >= 10)
{
logFile.flush();
entriesWritten = 0;
}
}
然而,我想介绍一个用例,在编写了x个条目(x之后,您可能需要研究 此类提供对象监视方法的功能(
wait
、notify
和notifyAll
)-它们被称为wait
、signal
和signalAll
,以避免名称与从对象继承的方法冲突
您可能感兴趣的是该方法,因为它允许您指定超时:
使当前线程等待,直到发出信号或被中断,或经过指定的等待时间
另一方面,对于您的用例来说,一个简单的方法可能就足够了。您说的buffer.getEntry()
调用Object.wait()
。实现另一个方法,buffer.getEntry(长超时)
调用Object.wait(超时)
,如果发生超时,则返回null
BufferEntry entry = buffer.getEntry(timeout); // might block
if (entry != null) {
logFile.printf("%s", entry);
++entriesWritten;
}
if (entriesWritten >= 10 || entry == null) {
logFile.flush();
entriesWritten = 0;
}
我喜欢使用Lock和Condition的建议。Condition的method wait返回一个布尔值,指示线程是否由于超时而唤醒。再加上Alexei关于重载getEntry以接收超时的建议,这可能是一个很好的解决问题的方法,同时仍然保持缓冲区对象足够的通用性。谢谢!我喜欢你的想法verload getEntry方法。这种方式Buffer只提供了一个附加服务,并保持足够的通用性。在API文档中,我没有看到对象的wait方法指示线程由于超时而被唤醒。我认为Hulk建议使用Lock and Condition,再加上您建议重载该方法,将是一个很好的解决方案。Th脚踝