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

Java 如何按顺序进行多线程处理?,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部分,如果它令人困惑,我的主要目的

这里是我试图解决的问题,但不确定如何解决:我有一个对象数组(比如大小为100),每个对象都有一些id

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
    对象并在线程上调用其执行
  • 我将在这里为选项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
    对象。所有员工都是并行处理的,但每个员工的任务都是按顺序执行的


    希望这能有所帮助

    如果每个项目都有繁重的处理,并且订单只在返回结果时才重要,那么并行性仍然是有意义的。在这种情况下,可能会使用倒计时闩锁之类的东西。@jpm*ab*​用过。最好是先执行线程处理,然后按顺序完成串行部分。@jpm您仍然会受到数据库速度的限制。是的,这一切都取决于处理还是IO对于这个问题来说更昂贵。(提示:通常是IO)@hexafraction如果我们忽略所有含义,只想以多线程顺序处理所有这些对象,会怎么样?如果数据库不控制id生成,以特定顺序输入它们会有什么区别?通常很难(不可能?)提前知道螺纹将被切断的顺序。因此,如果对象是由不同的线程添加的,则无法确保它们是按顺序添加的。但是您可以实现信号量来锁定一个线程,并等待其他线程将其对象添加到数据库中。多线程用于并发、独立的任务。没错,我也在考虑将所有对象放入优先级为EmployeeID的PriorityBlockingQueue中,然后将该队列传递给一个任务,启动10个线程,让任务执行。但是我又被问到所有线程都会按顺序选择任务,但不确定它是否会按顺序完成。(我在采访中被问到这个问题)。由于无法解决此问题,我被告知要解决如何确保不同线程不会从输入中拾取相同的记录(您必须隔离任务。在我建议的解决方案中,每个
    Runnable
    对象都与一个(并且只有一个)相关)
    Employee
    object,因此一个线程不可能与另一个
    Employee
    @Barranka一起工作-我想你已经回答了我的一个问题。为了确保这一点,我需要对45个元素的列表中的每一个元素执行大量的数学运算,使用六个线程,但完成后,列表的顺序必须相同。你的answeR是否适用于我的情况?或者现在有更好的方式使用java的新版本吗?@ MissLucy谢谢你阅读我的文章。我认为最好是把你的评论作为一个新的问题发表(如果你认为这个帖子有用,考虑把它链接起来)。一定要包括一些示例代码来看看你在做什么(记得读)。