关于多线程:我应该在我的Java视频应用程序中实现使用者/生产者模式吗?如果是,怎么办?

Should I implement the consumer/producer pattern in my java video app, and if yes, how?

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

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

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

  • 主线程和生产者线程
  • 使用者线程
  • 这是使用数据库处理实时数据的正确方法吗?


    使用固定数量的线程是有限的。我的PC有(仅)8个内核,您的密集型声音应用程序不会使用其中的一半,实际上可能只有消费者是密集型内核,因此可能是12.5%。您必须每个线程都有几个线程才能充分利用CPU,然后您将花费很多精力来管理线程。

    替代方法是使用各种现有系统之一在后台执行工作。例如,使用ThreadPoolExecutor,您可以对其进行大量处理(Runnable s),它将使工作排队,并且可以通过自定义工作线程的数量来扩展执行以适应其运行的硬件。铅>

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


    您的问题颇具概念性,所以我认为它属于这里:程序员

    不过,根据我的经验,您可以将生产者与主生产者分开,因为如果生产者出了问题,您的主控件可能会冻结。诸如冻结表格,不响应控件等之类的结果都可能是结果。使您的系统有机会通过命令重新建立。