我正试图完成一个大学项目的实验。我想并行运行它,使用多个核,这样我就可以增加样本大小。为了实现这一点,我创建了多个java线程(最多可达7,但我尝试使用最多2) java线程,并在所有这些线程中一次执行我的类。我的电脑有8个核心。
我遇到的问题是,Java在如何执行这些线程方面似乎是杂乱无章的。所有7个线程都启动良好。它们异步运行一段时间。在一次典型的跑步中,他们中的3人可能会在预期的时间内完成,第4人可能在几分钟后完成,而最后的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应该自动地使用所有的核心,而当我执行我的线程时,它们应该使用所有可用的核心。通常情况就是这样。当我做实验的时候,这是不可能发生的。我能做些什么来迫使线程在不同的核心上同时运行吗?
发布于 2014-02-18 15:19:56
您的示例代码很好。
如果您的一些线程没有返回,它们要么是阻塞(例如,在read()、write()、wait()上),要么是被困在一个循环中;就像任何其他不返回的程序一样。附加调试器,或只获取堆栈跟踪转储,以了解他们在做什么。
Java无法指定线程是如何分配到内核的。它依赖于实现,取决于Java实现和操作系统。
然而,在实践中,您会发现,只要您有一个合理的最新Java,线程将分散在内核之间。
发布于 2014-02-18 15:10:25
总之-不。
影响在可用处理器上调度不同任务和线程的因素很多。最明显的可能是JVM、硬件和正在运行的实际调度程序。没有简单的方法来强制这样做,或者保证在不同的核心上运行每个线程。
但是,可能有不同的方法使它们更有可能在不同的内核上结束,但我认为您可能已经用线程到达了行的末尾。
发布于 2014-02-18 15:59:17
您的字符串连接是琐碎的-几乎没有操作。
您的线程可能会将大部分时间都阻塞在System.Out I/O锁上,因此根本不运行。
如果你要启动线程,给他们一些合理的工作去做。
https://stackoverflow.com/questions/21857474
复制相似问题