这是我试图解决的问题,但不知道该怎么做:我有一个对象数组(比如大小为100),每个对象都有一些id。
Class Employee{
int EmployeeId;
}
有10个线程将从此数组中读取数据并插入 它进入数据库。
如何确保数据按照递增顺序的EmployeeId序列插入到数据库中。 例如:
如果数组包含EmployeeID 6,8和4的对象,那么这些对象 应按照EmployeeID 4,6和DB中的8顺序插入DB中。 如何为此编写多线程代码?
更新:请忽略数据库部分,如果令人困惑,我的主要目的是同时处理,但顺序处理。
答案 0 :(得分:5)
我认为你不理解这里使用线程。线程 1 用于并行任务,其中(除了一些障碍)排序无关紧要并且您的线程并行运行。您需要一个简单的循环或其他类型的串行行为。
您可以使用一个线程轻松完成此操作。你可以在这里采取安全的道路。线程不保证有关优化和排序的任何内容。如果预处理很昂贵,请以线程方式执行,然后确保所有线程都以CountdownLatch
结束,然后插入数据库。
1 线程可导致死亡,窒息,发冷,发烧,溺水,感染,恶心和the inability to control heavy machinery。
答案 1 :(得分:2)
如果我理解正确,你必须为数组的每个条目执行一些必须顺序(我假设为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
对象并在一个线程上调用它。我在这里写一个关于选项2的简单提案:
/*
* 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
对象。所有员工同时处理,但每个员工的任务按顺序执行。
希望这有帮助