【问题标题】:Why is my multithreaded program executing sequentially?为什么我的多线程程序是按顺序执行的?
【发布时间】:2015-11-22 11:06:13
【问题描述】:

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

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

你能告诉我为什么会这样执行吗? 执行不应该只在运行时是顺序的吗

【问题讨论】:

  • 尝试在每个循环的每次迭代中添加Thread.yield()Thread.sleep
  • 可能是因为循环很小。睡一觉就可以了。
  • 是的,我现在可以通过将循环增加到 1000 来查看程序的多线程性质,甚至无需使用 sleep() 、 wait() 等

标签: java multithreading java-threads


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    创建和启动线程在性能上是有代价的,这不是一个简单的轻量级操作。结果,它消耗了一些资源。

    在您的示例中,您的运行方法非常简单(用于打印的超过 5 个 int 的循环)。这段代码很轻量级,执行也很快。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        • 2016-05-17
        • 1970-01-01
        • 2021-06-18
        相关资源
        最近更新 更多