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

如何使用循环中生成的线程进行多线程处理?

宗政洋
2023-03-14

所以我正在编写代码,它将解析文件夹中的多个文本文件,收集它们的信息,并将这些信息保存在两个静态列表实例变量中。信息存放的顺序并不重要,因为我最终将对其进行排序。但由于某些原因,增加线程数不会影响速度。这是我的run方法和主方法中利用多线程的部分。

public void run() {
    parseFiles();
}
public static void main(String[] args) {
    while (filesLeft != 0) {
        Thread t = new Thread(new fileParser());
        t.start();
        try {
            t.join();
        }
        catch (InterruptedException e) {
            System.out.println("error.");
        }
}

如果需要额外的信息,我基本上有一个静态实例变量作为我需要浏览的文件的数组,还有一个常量是线程数(为了测试目的手动更改)。如果我有4个线程和8个文件,每个对parseFiles的调用都会经过数组的下两个文件,索引由一个静态实例变量监控。如果我有,比如说,4个线程和9个文件,第一个线程解析3个文件,接下来的解析2,用一个类似于filesToParse=Math.ceil(files左/线程左)的语句,后两个变量在天花板功能也是静态的。

我的代码中是否有任何错误,或者我应该简单地测试带有更多单词的较大文本文件,以查看添加线程的速度下降(目前我有5个文本文件,每个文件有20个段落,我得到大约60-70ms)。

共有1个答案

乐欣可
2023-03-14

写了一段可能有用的代码

public static void main(String[] args) {
    long startTime = System.nanoTime();

    final List<Runnable> tasks = generateTasks(NUM_TASKS);
    List<Thread> threadPool = new LinkedList<>();

    for(int i = 0; i < NUM_THREADS; i++) {
        Thread thread = new Thread(() -> {
            Runnable task = null;
            while ((task = getTask(tasks)) != null) {
                task.run();
            }
        });
        threadPool.add(thread);
        thread.start();
    }

    for(Thread thread: threadPool) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    long runTimeMs = (System.nanoTime() - startTime) / 1000000;
    System.out.println(String.format("Ran %d tasks with %d threads in %d ms", NUM_TASKS, NUM_THREADS, runTimeMs));
}

private static Runnable getTask(List<Runnable> tasks) {
    synchronized (tasks) {
        return tasks.isEmpty() ? null : tasks.remove(0);
    }
}
 类似资料:
  • 默认情况下,C++容器应该是线程安全的。我必须错误地使用多线程,因为对于此代码: 我得到了:

  • 问题内容: 假设我的清单很大,并且正在执行如下操作: 我的问题有两个: 有很多东西 api.my_operation需要永远返回 我想使用多线程一次启动一堆api.my_operations,以便我可以一次处理5或10甚至100个项目。 如果my_operation()返回一个异常(因为也许我已经处理过该项目),那就可以了。它不会破坏任何东西。循环可以继续到下一个项目。 注意 :这适用于Pytho

  • 这就是我试图解决但不确定如何解决的问题:我有一个对象数组(假设大小为100),每个对象都有一些id。 有10个线程将从该数组中读取数据并将其插入数据库。 如何确保数据以递增序列的方式根据员工ID的序列插入数据库。例如: 如果数组中的对象具有员工ID 6、8和4,那么这些对象应该按照员工ID 4、6和8在数据库中的顺序插入数据库。如何为此编写多线程代码? 更新:请忽略数据库部分,如果它令人困惑,我的

  • 问题内容: 问候贵族社区, 我想要以下循环: 这将在使用线程的共享内存四核计算机上并行运行。对于这些线程要执行的代码,正在考虑以下两种选择,其中线程的ID是:0、1、2或3。 (为简单起见,假设为4的倍数) 选项1: 选项2: 我的问题是,是否有一种方法比另一种方法更有效,为什么? 问题答案: 第二个比第一个更好。简单的答案:第二个最小化错误共享 现代CPU不会将字节一一加载到缓存中。它在称为缓存

  • 我已经写了这个生产者/消费者问题解决方案。它似乎在工作,而不是无限循环。我的印象是,pthread\u exit(NULL) 会让它停止,但老实说,我已经迷路了。有人能告诉我如何阻止循环的正确方向吗?

  • 我想以多线程方式阅读10个邮件帐户的未读邮件。 但是如果线程池大小为5,那么将使用线程池中的5个线程。每个线程将读取一个邮件帐户。因此,一旦Thread_1读取了第一个邮箱,它应该会读取mailbox_6。那么线程2将读取mailbox_7。 当所有邮件帐户都被读取一次后,循环将从第一个邮件帐户开始。 我们如何在java中做到这一点?