当前位置: 首页 > 知识库问答 >
问题:

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

穆德海
2023-03-14

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

Class Employee{
   int EmployeeId;
}

有10个线程将从该数组中读取数据并将其插入数据库。

如何确保数据以递增序列的方式根据员工ID的序列插入数据库。例如:

如果数组中的对象具有员工ID 6、8和4,那么这些对象应该按照员工ID 4、6和8在数据库中的顺序插入数据库。如何为此编写多线程代码?

更新:请忽略数据库部分,如果它令人困惑,我的主要意图是并行处理但按顺序处理。

共有2个答案

韦繁
2023-03-14

如果我理解正确,那么对于数组的每个条目,都必须按顺序执行一些任务(假设为10个)。

首先,您需要在实现可运行的类中按顺序组织这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写一个简单的建议:

/*
 * 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对象。但是,线程任务为每个员工对象按顺序执行任务列表。

请注意,无法判断在任何给定时刻处理了哪个员工对象。所有员工都是并行处理的,但每个员工的任务都是按顺序执行的。

希望这有帮助

井疏珂
2023-03-14

我认为你不理解线程在这里的使用。线程是指并行任务,其中(可能除了一些障碍)排序无关紧要,线程并行运行。这里需要一个简单的循环或其他类型的串行行为。

你可以很容易地做到这一点与一个线程。你可以走这条安全的路。线程不保证任何关于优化和排序的事情。如果预处理成本高昂,请以线程方式进行,然后确保所有线程都以倒计时锁存完成,然后插入到数据库中。

穿线可能导致死亡、窒息、发冷、发烧、溺水、感染、恶心以及无法控制重型机械。

 类似资料:
  • 默认情况下,C++容器应该是线程安全的。我必须错误地使用多线程,因为对于此代码: 我得到了:

  • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 问题内容: 我有3个线程第一打印A第二打印B第三打印C 我想按顺序打印ABCABCABC,依此类推..... 因此,我在下面编写了程序,但无法实现相同的目的。我知道一个问题,当时状态为1时,例如B1和C1线程正在等待,而当我做notifyAll()时,两个等待线程都被唤醒,并且取决于CPU分配,它可能会打印B或C。 在这种情况下,我只希望在A之后打印B。 我需要做什么修改。 问题答案: 将那些IF

  • 我们有1000多条数据,请求1000次第三方个接口, 效率很是低下! 所以我想利用多线程的方式快速的调用完这1000次接口请求并处理响应 但是有个问题,线程是在for循环中执行的,调用顺序肯定是错乱的,这就导致接调用后 返回的结果肯定和List中的不匹配了··· 这种情况怎么能保证顺序呢?这是我的代码

  • 问题内容: 如果我有这样的数据: 我如何将命令连接成这样: 我在下面使用了此查询,但命令列的顺序不依其顺序号而定: 任何意见和建议将不胜感激。^ _ ^ 问题答案: 永远不要使用。阅读为什么不在Oracle中使用WM_CONCAT函数? 请参阅本主题https://stackoverflow.com/a/28758117/3989608。 它没有记录,并且依赖的任何应用程序一旦升级到后都将无法工作