查看以下代码。此代码段中的所有语句都在主线程中执行。 线程是独立的执行单元,即两个不同的线程可以同时执行,彼此独立,对吧?
这是否意味着一旦new Thread(new Consumer()).start();
语句的执行完成(即new Thread(new Producer()).start();
线程执行完毕时,将执行语句Producer
,在run()
Producer
方法返回后是?
或者JVM只是在调用第一个线程的new Thread(new Consumer()).start();
方法之后,即在第一个start()
语句之后,直接进入并开始执行Producer
语句。 {1}}线程正在运行?
public class ThreadsCoordinationUsingGuardedBlocks {
public static void main(String[] args) {
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
}
}
答案 0 :(得分:3)
两个不同的线程可以同时执行,彼此独立,对吗?
他们也是独立开始的,这意味着他们可以以任何顺序开始,如果一个人快速完成,它可以在其他人甚至有机会开始之前停止。
生产者的run()方法返回后?)
这是可能的,线程也可能以相反的顺序完成。
或者JVM是否只是到达并开始执行新的Thread(new Consumer())。start();语句,
注意:JVM不实现线程。这是操作系统的工作。所有Java都会对操作系统进行系统调用,以告诉它这样做。 JVM不知道调用start()
多久后将调用这些线程的run()
。
答案 1 :(得分:2)
您应该假设订单是非确定性的。 Thread()
可能是一个可调度事件,因此即使在单处理器上也无法保证执行顺序,您也可能在多处理器上运行。
您的代码应该显式处理同步 - 即使您运行的实现的某些怪癖导致确定性执行,显式同步用于传达代码的意图并防止底层线程代码的更改。