【问题标题】:Why threads are executing sequentially?为什么线程是顺序执行的?
【发布时间】:2018-01-15 07:34:02
【问题描述】:

Q.1 我试图同时运行两个线程,但这里它是按顺序打印值。例如,它打印 0 然后 1 再打印 0 然后 1。如果线程同时运行,那么它不应该打印 0 0 然后 1 1。

Q.2 它给出的输出类似于 10、11,然后是 0、1、0、1。当它首先打印 10 和 11 时。这是否意味着线程 t1 和 t2 尚未启动,即使程序控制首先转到 t1.start()t2.start()

public class Main implements Runnable
{
    int x;

    public void run()
    {
        for(int i = 0; i < 2; i++)
        {
            System.out.println(x++);
        }
    }

    public static void main(String[] args)
    {
        Thread t1 = new Thread(new Main());

        Thread t2 = new Thread(new Main());

        t1.start();
        t2.start();

        int y = 10;
        for(int i = 0; i < 2; i++)
        {
            System.out.println(y++);
        }
    }
}

【问题讨论】:

  • 无法保证线程的执行顺序,因此无法预测您将获得输出的顺序。它可以是 0、1、0、1 或 0、0、1、1。
  • 基本上,当您谈论多线程程序时,您无法预测它们的执行方式和时间。你也不能只使用println(),因为它是缓冲的,不反映程序的执行。

标签: java multithreading java-threads


【解决方案1】:

线程使用的x 变量与main 方法中打印的x 变量不同。

由于线程中执行的代码非常短,所以第一个线程将在第二个线程启动时完成

此外,通过这个简单的示例,您的代码也会受到输出缓冲区的影响。

【讨论】:

  • 他在 main 方法中编辑了 x,因此您可能希望删除答案的那部分。我是在编辑后到达的,你的回答让我困惑了一秒钟。
  • @Michael 感谢您的提醒。在他编辑之后,我什至不确定他的问题 2) 是否有意义。
  • 我编辑是因为我不想把你和'x'混淆。我的第二个问题是为什么当我调用 t1.start() 和 t2.start( ) 在主线程中的循环之前。
  • 因为启动线程有一定的开销,并且在将控制权传回main之后但在它们启动working之前会经过一段时间。
  • 对于我的机器上的一个测试,在第一个线程开始之前,main 计数高达 260。然后第一个线程工作到 768 和 main 到 300,在那一刻第二个线程开始工作。另一方面,最好打印 System.currentTimeMillis() 和 Thread.currentThread().getId() 或类似的时间和线程信息,以便能够更轻松地解析日志。它在如此短的工作场景中改变了事情,但在实践中日志记录并没有那么过度
【解决方案2】:

如果您想查看实际的并发性,将 sleep() 方法放在 run 方法中的某个位置应该会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2011-12-16
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多