gpt4 book ai didi

java - 如何检查线程时序?

转载 作者:行者123 更新时间:2023-12-01 11:58:04 24 4
gpt4 key购买 nike

我编写了一个应用程序,它读取文本文件中的所有行并测量时间。我想知道整个街区的时间是多少。例如,如果我同时启动 2 个线程:

for (int i = 0; i < 2; i++) {
t[i] = new Threads(args[j], 2);
j++;
}

try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("TIME for block 1 of threads; "
+ (max(new long[]{t[0].getTime(),t[1].getTime()})));

等待他们停止处理文件并读取操作时间(通过 getTime)。对于多线程来说,在这种情况下,线程 block 的时间将是从线程获得的最大时间,这是一个好的想法吗?我认为是的,因为当具有最大时间的线程停止时,其他线程将停止工作。

或者也许我应该换个方式思考?

最佳答案

当有多个线程时,争论执行顺序是很危险的!例如。如果您在单核 CPU 上运行代码,线程实际上不会并行运行,而是顺序运行,因此两个线程的总运行时间是每个线程运行时间的总和,而不是两者的最大值。

幸运的是,如果您使用 ExecutorService 而不是直接使用 Thread,有一种非常简单的方法可以测量这一点(顺便说一句。这始终是一个很好的建议) :

// 1. init executor
int numberOfThreads = 2; // or any other number
int numberOfTasks = numberOfThreads; // is this true in your case?
ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);

long startTime = System.currentTimeMillis();

// 2. execute tasks in parallel using executor
for(int i = 0; i < numberOfTasks; i++) {
executor.execute(new Task()); // Task is your implementation of Runnable
}

// 3. initiate shutdown and wait until all tasks are finished
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES); // we won't wait forever

// 4. measure time
long delta = System.currentTimeMillis() - startTime;

现在,delta 保存任务的总运行时间。您可以使用 numberOfThreads 来查看更多或更少的线程是否会给出不同的结果。

重要提示:在 Java 中从文件读取不是线程安全的,因此不允许在线程之间共享 ReaderInputStream!

关于java - 如何检查线程时序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275183/

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