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

时间:2016-02-13 17:47:11

标签: java multithreading concurrency java.util.concurrent java-threads

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

这是否意味着一旦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();
    }
}

2 个答案:

答案 0 :(得分:3)

  

两个不同的线程可以同时执行,彼此独立,对吗?

他们也是独立开始的,这意味着他们可以以任何顺序开始,如果一个人快速完成,它可以在其他人甚至有机会开始之前停止。

  

生产者的run()方法返回后?)

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

  

或者JVM是否只是到达并开始执行新的Thread(new Consumer())。start();语句,

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

答案 1 :(得分:2)

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

您的代码应该显式处理同步 - 即使您运行的实现的某些怪癖导致确定性执行,显式同步用于传达代码的意图并防止底层线程代码的更改。