Java 如何按顺序进行多线程处理?
这里是我试图解决的问题,但不确定如何解决:我有一个对象数组(比如大小为100),每个对象都有一些idJava 如何按顺序进行多线程处理?,java,multithreading,concurrency,Java,Multithreading,Concurrency,这里是我试图解决的问题,但不确定如何解决:我有一个对象数组(比如大小为100),每个对象都有一些id Class Employee{ int EmployeeId; } 有10个线程将从该数组读取数据并插入 将其输入数据库 如何确保根据EmployeeId的递增顺序将数据插入数据库。 例如: 如果数组中有EmployeeID为6、8和4的对象,则这些对象 应按DB中EmployeeID 4、6和8的顺序插入DB。 如何为此编写多线程代码 更新:请忽略DB部分,如果它令人困惑,我的主要目的
Class Employee{
int EmployeeId;
}
有10个线程将从该数组读取数据并插入
将其输入数据库
如何确保根据EmployeeId的递增顺序将数据插入数据库。
例如:
如果数组中有EmployeeID为6、8和4的对象,则这些对象
应按DB中EmployeeID 4、6和8的顺序插入DB。
如何为此编写多线程代码
更新:请忽略DB部分,如果它令人困惑,我的主要目的是并行处理,但按顺序处理。我认为您不理解线程的用法。Threading1适用于并行任务,其中(可能除了一些障碍)排序并不重要,线程并行运行。这里需要一个简单的循环或其他类型的串行行为 你可以很容易地做到这一点与一个线程。你可以走这条安全的路。线程不保证任何关于优化和排序的内容。如果预处理代价高昂,请以线程方式进行,然后确保所有线程都以
CountdownLatch
完成,然后插入到数据库中
1线程可能导致死亡、窒息、寒战、发烧、溺水、感染、恶心和呕吐。如果我理解正确,您有一些任务必须按顺序(我假设10)为数组的每个条目执行 首先,您需要在实现
Runnable
的类中按顺序组织这10个任务:
public class ThreadedTask implements Runnable {
private Employee employee;
public ThreadedWork(Employee employee) {
this.employee = employee;
}
public void executeTaskList(Employee employee) {
task1(employee);
task2(employee);
// ...
task10(employee);
}
public void run() {
executeTaskList();
notify();
}
}
然后,您可以实施以下解决方案之一:
Employee
对象,创建一个ThreadedTask
对象并在线程上调用其执行Employee
对象,然后使用for
循环创建ThreadedTask
对象并在线程上调用其执行/*
* I am assuming that there`s an array called empArray, which holds 100 employees.
* It's up to you to decide how it is populated.
*/
public void processEmployees() {
// ...
for(Employee e : empArray) {
(new Thread(new ThreadedTask(e))).start()
}
// ...
}
如您所见,逻辑分为两部分:由您定义empArray
的填充方式,以及ThreadedTask
对象的创建和执行方式。但是ThreadedTask
为每个Employee
对象顺序执行任务列表
请注意,无法判断在任何给定时刻处理哪个Employee
对象。所有员工都是并行处理的,但每个员工的任务都是按顺序执行的
希望这能有所帮助如果每个项目都有繁重的处理,并且订单只在返回结果时才重要,那么并行性仍然是有意义的。在这种情况下,可能会使用倒计时闩锁之类的东西。@jpm*ab*用过。最好是先执行线程处理,然后按顺序完成串行部分。@jpm您仍然会受到数据库速度的限制。是的,这一切都取决于处理还是IO对于这个问题来说更昂贵。(提示:通常是IO)@hexafraction如果我们忽略所有含义,只想以多线程顺序处理所有这些对象,会怎么样?如果数据库不控制id生成,以特定顺序输入它们会有什么区别?通常很难(不可能?)提前知道螺纹将被切断的顺序。因此,如果对象是由不同的线程添加的,则无法确保它们是按顺序添加的。但是您可以实现信号量来锁定一个线程,并等待其他线程将其对象添加到数据库中。多线程用于并发、独立的任务。没错,我也在考虑将所有对象放入优先级为EmployeeID的PriorityBlockingQueue中,然后将该队列传递给一个任务,启动10个线程,让任务执行。但是我又被问到所有线程都会按顺序选择任务,但不确定它是否会按顺序完成。(我在采访中被问到这个问题)。由于无法解决此问题,我被告知要解决如何确保不同线程不会从输入中拾取相同的记录(您必须隔离任务。在我建议的解决方案中,每个
Runnable
对象都与一个(并且只有一个)相关)Employee
object,因此一个线程不可能与另一个Employee
@Barranka一起工作-我想你已经回答了我的一个问题。为了确保这一点,我需要对45个元素的列表中的每一个元素执行大量的数学运算,使用六个线程,但完成后,列表的顺序必须相同。你的answeR是否适用于我的情况?或者现在有更好的方式使用java的新版本吗?@ MissLucy谢谢你阅读我的文章。我认为最好是把你的评论作为一个新的问题发表(如果你认为这个帖子有用,考虑把它链接起来)。一定要包括一些示例代码来看看你在做什么(记得读)。