我用桌面Java 8构建了一个小型视频帧分析应用程序。在每一帧上,我提取数据(现在是5倍,但将来可以扩展到1920x1080x3 OpenCV Mat )。我希望将这些数据存储到数据库(例如,Java)中,以执行一些时间序列分析,并定期将结果返回给用户。
如果我写到数据库并在一个线程上运行应用程序,我担心硬盘的访问时间,而我遇到的最好的解决方案是用多线程实现生产者/消费者模式。我发现的所有示例都实现了3个线程:
与2线程实现相比,这样做有什么好处吗?
这是用数据库处理实时数据的正确方法吗?
发布于 2015-03-01 08:33:34
它限制使用固定数量的线程。我的个人电脑只有8个内核,你的强化应用程序不会使用其中的一半,实际上可能只有消费者才是密集型应用,所以可能只有12.5%。为了充分利用CPU,您需要每个线程中的几个线程,然后您将花费大量的精力来管理线程。
另一种方法是使用各种现有系统之一在后台执行工作。例如,ThreadPoolExecutor只需在它上抛出大量的工作(Runnables),它就会对工作进行队列处理,并且可以通过自定义工作线程的数量来缩放执行,以适应它正在运行的硬件。
或者如果您使用的是Swing,那么SwingWorker。这样做的优点是您可以在后台线程上做一些工作,并轻松地将结果发布到前台(main/UI)线程上。
发布于 2015-03-01 08:20:59
你的问题是概念性的,所以我认为它是属于这里的:Programmers
但是,从我的经验中可以得到一个简短的提示,你将生产者和主生产者分开,因为如果生产者出了问题,你的主控制可能会冻结。结果可能是冻结的表单、没有响应的控件等。给你的系统一个通过命令重建的机会。
https://stackoverflow.com/questions/28791424
复制相似问题