两个线程是同时在连续语句 运行 中启动,还是一个接一个 运行?
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
线程完成执行时,即在Producer
的run()
方法返回后)?
或者 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()
可能是一个可安排的事件,因此即使在单处理器上也无法保证执行顺序,您也可能 运行 在多处理器上进行。
您的代码应该显式处理同步——即使您 运行 的实现中的一些怪癖导致确定性执行,显式同步用于传达您的代码的意图并防止底层线程代码发生变化.
看下面的代码。此代码段中的所有语句都在主线程中执行。 线程是独立的执行单元,即两个不同的线程可以同时执行,彼此独立,对吧?
这是否意味着语句new Thread(new Consumer()).start();
将在new Thread(new Producer()).start();
语句执行完成后执行(即当Producer
线程完成执行时,即在Producer
的run()
方法返回后)?
或者 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()
可能是一个可安排的事件,因此即使在单处理器上也无法保证执行顺序,您也可能 运行 在多处理器上进行。
您的代码应该显式处理同步——即使您 运行 的实现中的一些怪癖导致确定性执行,显式同步用于传达您的代码的意图并防止底层线程代码发生变化.