我应该在java视频应用程序中实现消费者/生产者模式吗?如果是,如何实现?

我应该在java视频应用程序中实现消费者/生产者模式吗?如果是,如何实现?,java,multithreading,producer-consumer,Java,Multithreading,Producer Consumer,我用桌面Java 8构建了一个小型视频帧分析应用程序。在每一帧上,我提取数据(现在5倍,但将来可以扩展到1920x1080x3 OpenCVMat)。我想将这些数据存储到一个数据库(例如JavaDB)中,以执行一些时间序列分析,并定期将结果返回给用户 如果我写入数据库并在单个线程上运行应用程序,我担心硬盘访问时间,我想到的最佳解决方案是使用多线程实现生产者/消费者模式。我发现的示例都实现了3个线程: 主线 生产线 消费者线索 与2线程实现相比,这样做是否有优势 主线程和生产线程 消费线程 这是用

我用桌面Java 8构建了一个小型视频帧分析应用程序。在每一帧上,我提取数据(现在5倍,但将来可以扩展到1920x1080x3 OpenCV
Mat
)。我想将这些数据存储到一个数据库(例如JavaDB)中,以执行一些时间序列分析,并定期将结果返回给用户

如果我写入数据库并在单个线程上运行应用程序,我担心硬盘访问时间,我想到的最佳解决方案是使用多线程实现生产者/消费者模式。我发现的示例都实现了3个线程:

  • 主线
  • 生产线
  • 消费者线索
  • 与2线程实现相比,这样做是否有优势

  • 主线程和生产线程
  • 消费线程

  • 这是用数据库处理实时数据的正确方法吗?

    你的问题相当概念化,因此我认为它属于这里:


    但是,根据我的经验,有一个简短的提示,你把制作人和主控分开,因为如果制作人出了问题,你的主控可能会冻结。结果可能是冻结表单、不响应控件等。给你的系统一个通过命令重建的机会。

    你的问题相当概念化,因此我认为它属于这里:


    但是,根据我的经验,有一个简短的提示,你把制作人和主控分开,因为如果制作人出了问题,你的主控可能会冻结。结果可能是冻结表单、不响应控件等。给你的系统一个通过命令重新建立的机会。

    它限制使用固定数量的线程。我的电脑(只有)8个内核,你的声音密集型应用程序不会使用其中的一半,事实上,可能只有消费者是密集型的,所以可能是12.5%。每个线程必须有几个线程才能最大限度地利用CPU,然后您将花费大量精力管理线程

    另一种方法是使用各种现有系统之一在后台执行工作。例如,您可以对它抛出大量的工作(
    Runnable
    s),它将工作排队,并且可以通过自定义工作线程的数量来调整执行以适应其运行的硬件


    或者如果你用的是Swing,那么。这样做的好处是,您可以在后台线程上进行一些工作,并轻松地将结果发布到前台(主/UI)线程上。

    限制使用固定数量的线程。我的电脑(只有)8个内核,你的声音密集型应用程序不会使用其中的一半,事实上,可能只有消费者是密集型的,所以可能是12.5%。每个线程必须有几个线程才能最大限度地利用CPU,然后您将花费大量精力管理线程

    另一种方法是使用各种现有系统之一在后台执行工作。例如,您可以对它抛出大量的工作(
    Runnable
    s),它将工作排队,并且可以通过自定义工作线程的数量来调整执行以适应其运行的硬件


    或者如果你用的是Swing,那么。这样做的好处是,您可以在后台线程上做一些工作,并轻松地将结果发布到前台(主/UI)线程。

    我发现您的答案很有启发性。就我个人的理解而言,你是在说让操作系统有机会以最佳方式平衡工作负载,从而创建许多线程,但将它们的分布留给好的框架吗?我把这里的讨论比作:@peter_the_oak好吧,你可以创建X个线程,或者你可以获得一个线程池来创建X个线程。操作系统不知道有什么区别。
    ThreadPoolExecuter
    的优点是,它的编写使这些线程忙于处理队列中的工作。如果不利用这一点,你有很多工作要做,而且这也是一项棘手的工作。我觉得你的回答很有启发性。就我个人的理解而言,你是在说让操作系统有机会以最佳方式平衡工作负载,从而创建许多线程,但将它们的分布留给好的框架吗?我把这里的讨论比作:@peter_the_oak好吧,你可以创建X个线程,或者你可以获得一个线程池来创建X个线程。操作系统不知道有什么区别。
    ThreadPoolExecuter
    的优点是,它的编写使这些线程忙于处理队列中的工作。如果不利用这一点,你会有很多工作要做,而且这也是一项棘手的工作。