如何按顺序进行多线程处理?

时间:2013-09-06 14:54:33

标签: java multithreading concurrency

这是我试图解决的问题,但不知道该怎么做:我有一个对象数组(比如大小为100),每个对象都有一些id。

Class Employee{
   int EmployeeId;
}
  

有10个线程将从此数组中读取数据并插入   它进入数据库。

如何确保数据按照递增顺序的EmployeeId序列插入到数据库中。 例如:

  

如果数组包含EmployeeID 6,8和4的对象,那么这些对象   应按照EmployeeID 4,6和DB中的8顺序插入DB中。   如何为此编写多线程代码?

更新:请忽略数据库部分,如果令人困惑,我的主要目的是同时处理,但顺序处理。

2 个答案:

答案 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();
    }
}

然后,您可以实施以下解决方案之一:

  1. 在数组中插入Employee对象,创建一个ThreadedTask对象并在一个线程上调用它。
  2. 在数组中插入所有Employee个对象,然后使用for循环创建一个ThreadedTask对象并在一个线程上调用它。
  3. 我在这里写一个关于选项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对象。所有员工同时处理,但每个员工的任务按顺序执行。

    希望这有帮助