public class Rough {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread1 testThread1 = new TestThread1();
TestThread2 testThread2 = new TestThread2();
testThread1.start();
testThread2.start();
// testThread1.stop();
System.out.println(testThread1.getName());
System.out.println(testThread2.getName());
}
}
class TestThread1 extends Thread {
public void run() {
System.out
.println("MyThread1 running :: " + System.currentTimeMillis());
}
}
class TestThread2 extends Thread {
public void run() {
System.out
.println("MyThread2 running :: " + System.currentTimeMillis());
}
}
每次执行时都会给出随机输出。
Thread-0
Thread-1
MyThread1 running :: 1398752090142
MyThread2 running :: 1398752090142
下次
MyThread1 running :: 1398752090142
Thread-0
Thread-1
MyThread2 running :: 1398752090142
下次
Thread-0
MyThread1 running :: 1398752090142
Thread-1
MyThread2 running :: 1398752090142
有人可以解释为什么会这样吗?
感谢。
答案 0 :(得分:7)
它仅依赖于JVM线程调度程序来调度线程。当您有多个线程时,它可以按任何顺序执行。因此,您会看到不同的输出。
答案 1 :(得分:1)
启动线程时,启动的线程并行运行所有已运行的线程。线程调度程序调度可用处理器上的各种线程,每个线程获得一些处理器时间,每个线程轮流。但是处理器,分配给每个线程的顺序和时间取决于操作系统线程调度程序,你绝对不能保证。
答案 2 :(得分:1)
对于像这样的多个线程来说,这实际上是非常期待的行为。原因是,当您有多个线程时,无论是否在多核/线程处理器上运行它们,都无法对它们运行的顺序或速度做出任何假设。
如果您使用的处理器一次只支持一个线程,则线程运行的顺序/时间完全取决于JVM如何调度线程。因为它可以调度它想要的线程,并且只要它想要你有一些线程比其他线程更早地到达它们的打印调用。
如果您正在进行允许并发运行线程的进程,那么您实际上会在各个线程之间获得关于哪个线程首先到达print语句的竞争条件。