在Java中的第一条指令之前,调度程序是否可以挂起一个线程?

时间:2015-03-13 22:21:11

标签: java concurrency

在Java中,在执行第一条指令之前,调度程序是否可以挂起一个线程?那么,实际参数已经设置好了,但是方法的第一条指令还没有被调用?例如:

void method(int value) {
    // [1]
    int otherValue = otherMethod(value);
}

那么,线程可以暂停在[1]吗?

3 个答案:

答案 0 :(得分:3)

是的,它可以。即使你没有看到它们,也会在那个地方有装配说明。

我们以此代码为例:

private void method(final int value) {
    System.out.println(value);
}

这会产生以下字节码:

  // access flags 0x2
  private method(I)V
   L0
    LINENUMBER 8 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L1
    LINENUMBER 9 L1
    RETURN

因此,执行此字节码的线程可以在GETSTATIC java/lang/System.out : Ljava/io/PrintStream;处暂停,这实际上是之前您可以在Java代码中看到的实际调用。

答案 1 :(得分:2)

是的,它可以。为什么不呢?此外,[1]实际上并不是底层本机线程执行的第一条指令,因此我们可以将[1]视为每个其他操作。实际上并没有什么特别之处。

答案 2 :(得分:0)

线程调度程序随时可以将线程从“运行”状态中取出。 查看API中允许的java.lang.Thread.States,这个有用的State Transition Diagram

你永远不能依赖线程的执行序列,除非你已经正确编码了那个序列(例如使用synchronized.join等)。

引用Java Language Specification

  

这些语义没有规定如何执行多线程程序。相反,它们描述了允许多线程程序展示的行为。任何只生成允许行为的执行策略都是可接受的执行策略。