【问题标题】:Do two threads started in consecutive statements run at the same time, or do they run one after another?在连续语句中启动的两个线程是同时运行,还是一个接一个地运行?
【发布时间】:2016-05-24 19:38:53
【问题描述】:

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

这是否意味着一旦new Thread(new Producer()).start(); 语句的执行完成(即Producer 线程执行完毕,即在run() 方法之后Producer 已返回)?

或者 JVM 只是在它调用第一个线程的start() 方法之后,即第一个Producer 线程正在运行?

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

【问题讨论】:

  • 不能保证其中一个的执行顺序。这就是为什么 Java 和所有理智的编程语言确实提供了使执行可以同步的机制的原因。在 Java 中,一个这样的例子是BlockingQueue

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


【解决方案1】:

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

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

Producer的run()方法返回后)?

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

或者 JVM 只是简单地进入并开始执行新线程(new Consumer()).start();声明,

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 1970-01-01
      • 2017-03-25
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多