如何在Java中基于优先级并行运行线程



我想从文件夹中读取csv文件并将其数据持久化到数据库中。我们也可以在单线程模型中实现这一点,但我想使用多线程来实现它。所以我把任务分成了4个线程:

线程1:从文件夹中查找文件,如果找到合适的文件,然后选择它并放入临时文件夹并删除旧文件。

线程2:从临时文件夹中读取文件并从文件中创建数据列表。还可以根据一些验证创建输出和错误数据。

线程3 [Low Priority]:检查输出和错误数据,并将其写入输出和错误日志文件。

线程4:检查列表中的数据,如果发现数据,将它们插入数据库

对于所有线程,我想检查是否没有输入数据,然后该线程进入等待状态,并通知其他线程,一旦完成工作,它的控制应该移交给其他线程。所有这些线程应该以连续的基数执行。

由于我对多线程概念不太熟悉,请建议我如何实现此场景

你有一个问题,你想用多线程来解决它。现在你有两个问题。:)

首先,你必须想办法把你的问题分解成可以并行处理的问题。您现在分解问题的方式本质上是顺序的。当您这样分解多线程时,它没有任何优势,因为吞吐量将受到进程中最慢步骤的限制。

分解问题的更好方法是将作业分解为重复执行的任务。最慢,但也是最容易并行的部分是读取和上传文件。您可以并行地对每个文件执行此操作。这允许你利用java的高级并发对象,这将使你免于痛苦的世界。

线程1:观察输入文件夹中的文件。当出现新文件时,创建一个任务。该任务被提交给任务执行器。然后,执行器将使用其中一个可用线程在其自己的线程上执行任务。

Task:对于给定的文件,任务读取、解析和验证文件中的数据。当数据有效时,将其写入数据库并删除/移动原始文件。

线程2:观察任务执行器是否完成任务。当一个任务完成时,读取它的信息,并写一份报告或记录错误,如果出现问题。

线程3:因为你有并行进行的任务,你需要一些东西来监控用户请求,以优雅地停止服务。你肯定不想在写报告的时候中途停止服务吧。

日志记录:日志记录是一个单独的关注点,但与线程无关。您应该为此使用日志记录框架。大多数框架都可以处理多线程日志。

最后请注意,您的问题听起来不像是一个可以从并行处理中获益的问题。读取文件和将它们上传到数据库都是IO操作,并且与其他计算相比,IO操作非常慢。它们也是所有并行进程的瓶颈。读取文件的速度不能超过磁盘提供的速度,上传文件的速度也不能超过网络连接的速度。因此,您必须问问自己,稍微提高的速度是否值得增加复杂性。

可以使用Thread3.setPriority(Thread.MIN_PRIORITY);优先级为int number 1-10 1为最小值,10为最大值

最新更新