gpt4 book ai didi

Java 线程未异步运行 - 有些根本未完成

转载 作者:行者123 更新时间:2023-12-01 18:36:19 25 4
gpt4 key购买 nike

我正在尝试完成大学项目的实验。我想利用多个核心并行运行它,这样我就可以增加样本大小。为了实现这一目标,我创建了多个(最多 7 个,但我尝试使用少至 2 个)java 线程,并同时在所有这些线程中执行我的类。我的电脑有 8 个核心。

我遇到的问题是 Java 的线程执行方式似乎是随意的。所有 7 个线程都启动良好。它们异步运行一段时间。在典型的运行中,也许其中 3 个会在预期时间内完成,第四个可能会在几分钟后完成,最后 3 个根本不会完成。

实验类设计为运行一定量的挂钟时间(不是 CPU 时钟时间)。这个因素不在我的控制范围之内。因此,我需要我的线程始终在单独的内核上同时运行。

以下代码片段展示了我用来创建线程并启动它们的方法。它显然没有调用我用于实验的类,如果您复制它并自己运行它,您会发现它工作正常。我在这里提供它只是为了证明我正在正确创建和使用线程。几天来我一直在寻找这个问题的答案,但看不出我做错了什么。

这是一个测试类,展示了我的实验类所使用的手段。它只是连接一些字符串数据以确保足够长的运行过程。

public class ThreadTestClass implements Runnable {

@Override
public void run() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
System.out.println("This thread is underway");
int i=0;
String a="a";
while(i<25){
a=a+a;
i++;
}
System.out.println("This thread ran fine");

}

}

它的名字是这样的:

   private static void ThreatTestMethod(){
Thread[] threads = new Thread[7];
int i=0;

while(i<threads.length){
threads[i] = new Thread(new ThreadTestClass());
threads[i].start();
i++;
}

while(threads[0].isAlive() || threads[1].isAlive() || threads[2].isAlive() || threads[3].isAlive() || threads[4].isAlive() || threads[5].isAlive() || threads[6].isAlive()){
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
System.out.println("Interrupted Exception Occurred");
}
}

}

我的理解是,Java 应该自动利用所有核心,并且当我执行线程时,它们应该利用所有可用核心。这就是通常发生的情况。当我进行实验时,这种情况没有发生。我可以做些什么来强制线程在单独的内核上同时运行吗?

最佳答案

你的示例代码很好。

如果您的某些线程没有返回,则它们要么被阻塞(例如在 read()、write()、wait() 上),要么被困在循环中;就像任何其他不返回的程序一样。连接调试器,或者只是获取堆栈跟踪转储,以了解它们在做什么。

Java API 无法让您指定如何将线程分配给内核。它依赖于实现,取决于 Java 实现和操作系统。

然而在实践中,您会发现只要您有一个相当最新的 Java,线程就会在内核之间分布。

关于Java 线程未异步运行 - 有些根本未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21857474/

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