Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java周期性地唤醒阻塞线程_Java_Multithreading - Fatal编程技术网

Java周期性地唤醒阻塞线程

Java周期性地唤醒阻塞线程,java,multithreading,Java,Multithreading,我有一个程序,其中有几个线程写入缓冲区,有一个线程从缓冲区读取并写入文件。 缓冲区的实现方式是,当缓冲区为空时尝试提取条目,导致线程阻塞(使用wait())。 线程使用BufferedStream写入文件。 目前,我正在刷新缓冲流后,每10次的文件写入 while (true) { BufferEntry entry = buffer.getEntry(); // might block logFile.printf("%s", entry); ++entrie

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

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脚踝