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

标签 java multithreading

我正在尝试完成大学项目的实验。我想利用多个核心并行运行它,这样我就可以增加样本大小。为了实现这一目标,我创建了多个(最多 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/

相关文章:

java - 在 Heroku 上安装 Java 应用程序的 gem

java - 构建 3D 建模软件的起点

java - 如何停止正在运行的 TimerTask

java - 我可以使用 Set 集合来消除两个不同等于的重复项吗?

java - 由于后台线程,UI 无法顺利更新

java - JPEG 原始 blob 中的 "metadata"边界到底在哪里?

multithreading - 如何在 Perl 中使用线程?

c# - 匹配集合 Parallel.Foreach

java - 如何调度作用于单个对象的三个线程?

c# - 处理并发