首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java线程没有异步运行--有些根本没有完成

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

Stack Overflow用户
提问于 2014-02-18 14:58:22
回答 3查看 916关注 0票数 0

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

我遇到的问题是,Java在如何执行这些线程方面似乎是杂乱无章的。所有7个线程都启动良好。它们异步运行一段时间。在一次典型的跑步中,他们中的3人可能会在预期的时间内完成,第4人可能在几分钟后完成,而最后的3人根本不会完成。

实验班的设计是为了运行一定量的挂钟时间(而不是cpu时钟时间)。这个因素超出了我的控制范围。所以我需要我的线程在任何时候都在不同的核心上同时运行。

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

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

代码语言:javascript
运行
复制
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");

}

}

这就是它的名称:

代码语言:javascript
运行
复制
   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应该自动地使用所有的核心,而当我执行我的线程时,它们应该使用所有可用的核心。通常情况就是这样。当我做实验的时候,这是不可能发生的。我能做些什么来迫使线程在不同的核心上同时运行吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-18 15:19:56

您的示例代码很好。

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

Java无法指定线程是如何分配到内核的。它依赖于实现,取决于Java实现和操作系统。

然而,在实践中,您会发现,只要您有一个合理的最新Java,线程将分散在内核之间。

票数 3
EN

Stack Overflow用户

发布于 2014-02-18 15:10:25

总之-不。

影响在可用处理器上调度不同任务和线程的因素很多。最明显的可能是JVM、硬件和正在运行的实际调度程序。没有简单的方法来强制这样做,或者保证在不同的核心上运行每个线程。

但是,可能有不同的方法使它们更有可能在不同的内核上结束,但我认为您可能已经用线程到达了行的末尾。

票数 1
EN

Stack Overflow用户

发布于 2014-02-18 15:59:17

您的字符串连接是琐碎的-几乎没有操作。

您的线程可能会将大部分时间都阻塞在System.Out I/O锁上,因此根本不运行。

如果你要启动线程,给他们一些合理的工作去做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21857474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档