两个线程是同时在连续语句 运行 中启动,还是一个接一个 运行?

Do two threads started in consecutive statements run at the same time, or do they run one after another?

看下面的代码。此代码段中的所有语句都在主线程中执行。 线程是独立的执行单元,即两个不同的线程可以同时执行,彼此独立,对吧?

这是否意味着语句new Thread(new Consumer()).start();将在new Thread(new Producer()).start();语句执行完成后执行(即当Producer线程完成执行时,即Producerrun()方法返回后)?

或者 JVM 在 调用 第一个线程的 start() 方法后立即开始执行 new Thread(new Consumer()).start(); 语句,即第一个 Producer 线程 是 运行?

public class ThreadsCoordinationUsingGuardedBlocks {
    public static void main(String[] args) {
        new Thread(new Producer()).start();
        new Thread(new Consumer()).start();
    }
}

two different threads can be executing simultaneously, independent of each other, right?

他们也可以独立开始,这意味着他们可以按任何顺序开始,如果一个人完成得很快,它可能会在其他人还没来得及开始之前就停止。

after the run() method of Producer has returned)?

所以这是可能的,线程也有可能以相反的顺序完成。

Or does the JVM simply gets to and starts executing the new Thread(new Consumer()).start(); statement,

注意:JVM 不实现线程。这是 OS 的工作。 Java 所做的就是对 OS 进行系统调用以告诉它这样做。 JVM 不知道在 start() 被调用后多久会调用这些线程的 run()

您应该假设顺序是不确定的。 Thread() 可能是一个可安排的事件,因此即使在单处理器上也无法保证执行顺序,您也可能 运行 在多处理器上进行。

您的代码应该显式处理同步——即使您 运行 的实现中的一些怪癖导致确定性执行,显式同步用于传达您的代码的意图并防止底层线程代码发生变化.