我正在尝试并行运行两个线程,但是根据输出,它们看起来并不像parallel.i是Java的新手,无法弄清我的错误。
这是我的小努力。
主要代码:
public class FirstProgram {
public static void main(String[] args) {
TwoThread tt=new TwoThread();
tt.start();
for(int i=0; i<2; i++) {
System.out.println("Main class Thread");}
}
第二堂课代码
public class TwoThread extends Thread {
public void run() {//
for(int i=0; i<2; i++) {
System.out.println("New Thread");
}
}
}
输出
Main class Thread
Main class Thread
Main class Thread
New Thread
New Thread
New Thread
期望输出
Main class Thread
New Thread
Main class Thread
New Thread
Main class Thread
New Thread
答案 0 :(得分:3)
您正在正确启动第二个线程¹,并且您的线程(可能)并行运行。但这并不意味着一定要安排它们像这样交错。还有一些线程启动时间。
如果使线程运行更长的时间,则会看到它们正在并行运行。
例如,在我的中规格多核计算机上,每个线程运行20k循环,而不是运行3个循环,则显示块“ Main class Thread”和“ New Thread”块。 “主类线程”的第一个块相当大,这并不奇怪,因为新线程的启动时间很长,然后两个线程的输出块比较大,但是却交织在一起。不过,由于线程调度可能会有所不同,因此使用YMMV。
¹尽管通常,建议使用implement Runnable
而不是extend Thread
,然后使用new Thread(new TwoRunnable())
创建它。
答案 1 :(得分:0)
您不能期望多线程应用程序提供任何有序输出(除非您人为地同步/加入线程)。
当您start()
Thread
提交给Thread Scheduler
时。
Thread Scheduler
是JVM的一部分,它决定应该运行哪个线程。不能保证选择哪个Thread
来执行。 Thread Scheduler
主要使用抢占式或时间片式调度来调度线程。
如果您有多个核心,则两个线程都可以并行运行(这是并发执行与并行执行之间的区别)。但是,它仍然不会改变它依赖于Thread Scheduler
并且执行是不可预测的事实。