以下程序不应该按顺序执行,但它仍在执行。
class A extends Thread
{
public void run()
{
for(int i=0; i<=5; i++)
{
System.out.println("Thread A : "+i);
}
System.out.println("exit from A");
}
}
class B extends Thread
{
public void run()
{
for(int j=0; j<=5; j++)
{
System.out.println("Thread B: "+j);
}
System.out.println("exit from B");
}
}
class C extends Thread
{
public void run()
{
for(int k=0; k<=5; k++)
{
System.out.println("Thread C : "+k);
}
System.out.println("exit from C");
}
}
class ThreadCounter
{
public static void main(String arg[])
{
new A().start();
new B().start();
new C().start();
}
}
我得到的输出是:
Thread A start
Thread A : 1
Thread A : 2
Thread A : 3
Thread A : 4
Thread A end
Thread B start
Thread B : 1
Thread B : 2
Thread B : 3
Thread B : 4
Thread B end
Thread C start
Thread C : 1
Thread C : 2
Thread C : 3
Thread C : 4
Thread C end
你能告诉我为什么这样执行? 并非只有在运行
时才会执行顺序执行答案 0 :(得分:2)
在切换到下一个线程之前,线程完成的工作很少。
尝试将循环增加到100000或更多。
答案 1 :(得分:1)
创建和启动线程会带来性能成本,这不是简单的轻量级操作。结果,它消耗了一些资源。
在您的示例中,您的run方法非常简单(用于打印的循环超过5 int)。这段代码很轻,执行速度非常快。
我认为在创建下一个线程之前,每个循环的执行都会退出。尝试将Thread.sleep()添加到循环中,增加增量数,或者执行更复杂的操作。
答案 2 :(得分:1)
当调用新的A()。start()时,会创建一个新线程并开始执行。然后新的A()。start()返回。当调用新的B()。start()时,正在创建一个线程。在这段时间内,线程A将完成执行并返回,因为新的线程创建是一个代价高昂的阻塞调用。线程C也发生了同样的事情,因为线程B在线程C开始执行之前已经完成了。所以他们仍在并行执行。但是一个人在下一个人开始之前就已经完成了。尝试并行启动A,B和C,而不是像上面那样顺序启动。然后你可能会看到不同的结果。