2015-11-22 158 views
1

以下程序不应该按顺序执行,但它仍在执行。为什么我的多线程程序按顺序执行?

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 

能否请你告诉我,为什么执行是这样? 是不是执行只在运行时才是连续的

+1

尝试在每个循环的每个迭代中添加'Thread.yield()'或'Thread.sleep'。 – MadProgrammer

+3

可能因为循环很小。把一个睡在一个会做伎俩。 – Shamik

+0

是的,我现在可以通过将循环增加到1000来看到程序的多线程性质,甚至不使用sleep(),wait()等 – Snehal

回答

2

线程做的工作很少,以至于它们在切换到下一个线程之前完成。

尝试将循环增加到100000或更多。

1

创建和启动线程会降低性能,但这不是一个简单的轻量级操作。结果,它消耗了一些资源。

在您的示例中,您的运行方法非常简单(用于打印的循环超过5个int)。此代码非常轻巧,执行速度非常快。

我认为在创建下一个线程之前退出每个循环的执行。尝试在循环中添加一个Thread.sleep(),增加增量的数量,或者做一些更复杂的事情。

1

当新的A()。start()被调用时,一个新的线程被创建并开始执行。然后新的A()。start()返回。当新的B()。start()被调用时,正在创建一个线程。在这段时间内,线程A将完成执行并返回,因为新的线程创建是一个昂贵且阻塞的调用。线程C发生同样的事情,因为在线程C开始执行之前线程B已经完成了。所以他们仍然在并行执行。但是在下一次启动之前,一个正在完成。尝试以并行方式启动A,B和C,而不是像上面那样。然后你可能会看到不同的结果。