gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:03:10 24 4
gpt4 key购买 nike

因此,我正在编写代码来解析文件夹中的多个文本文件,收集它们的信息,并将该信息存储在两个静态 List 实例变量中。信息存储的顺序并不重要,因为无论如何我最终都会对其进行排序。但由于某种原因,增加线程数并不影响速度。这是我的 run 方法和 main 方法中使用多线程的部分。

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 都会遍历数组的接下来 2 个文件,索引由静态实例变量监视。比如说,如果我有 4 个线程和 9 个文件,第一个线程会解析 3 个文件,然后解析 2 个文件,并使用类似于 filesToParse = Math.ceil(filesLeft/threadsLeft) 的语句,上限函数中的后两个变量也是静态的。

我的代码中是否有任何错误,或者我应该只是测试包含更多单词的较大文本文件,以查看添加线程后速度的降低(目前我有 5 个文本文件,每个文件有 20 多个段落,大约需要 60-70 毫秒)。

最佳答案

编写了一段可能有用的代码

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);
}
}

关于java - 如何使用循环中生成的线程进行多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com