java - 线程之间的信号

标签 java .net multithreading

这是一道伪代码面试题。有人告诉我以下方法存在问题。除了在事件等待时保持主线程之外,我找不到其他任何东西。你们能看到任何真正的问题吗?

问题是:

有一个主线程和一个子线程。子线程正在监视一条 30K 消息,该消息以 1K block 的形式从外部源发送。一旦子线程看到 1K block 准备就绪,它就会向主线程函数发出信号以检索数据。伪代码为:

// This method is called in main thread

void MainThreadFunction(out message)
{   
    var buffer;

    loop
    {
        event.Wait;
            read data to buffer;
        event.Release;

        if (all the data of the message complete)
        {
            exit loop;
        }
    }

    copy buffer to message;
}

// This method is in child thread

void ChildThreadFunction()
{

    // once the 1K chunk of data is ready
    event.Set;
}

最佳答案

子线程不会等待主线程读取数据,因此可以在读取旧数据之前开始用新数据覆盖它。

通常在这种情况下,您会维护 2 个或更多子线程可以写入的缓冲区。当主线程正在读取一个时,子线程正在写入下一个。当所有缓冲区都已满时,子线程必须等待主线程完成一个缓冲区。

参见:https://en.wikipedia.org/wiki/Multiple_buffering

关于java - 线程之间的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913804/

相关文章:

java - 线程永远等待通知情况

Java/XML/SQL - XML 中的 SQL 无法在 JDBC (Sybase) 驱动程序中运行

java - 如何让线条变得半透明?

c# - 我如何在 C# 中制作参数 `out`?

java - 使用 Jersey 上传文件时设置文件大小限制

.net - 在调试和 Release模式下构建的 .NET 程序集之间的性能差异?

swift - 了解ios中异步工作的GCD任务的顺序

java - 为什么会出现 IllegalMonitorStateException?

java - 多线程并行处理

.net - 有没有办法通过 WCF 中的单个 TCP 连接进行真正的双向通信?