为什么我的多线程程序按顺序执行?

时间:2015-11-22 11:06:14

标签: java multithreading java-threads

以下程序不应该按顺序执行,但它仍在执行。

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

你能告诉我为什么这样执行? 并非只有在运行

时才会执行顺序执行

3 个答案:

答案 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,而不是像上面那样顺序启动。然后你可能会看到不同的结果。