在Java中,在执行第一条指令之前,调度程序是否可以挂起一个线程?那么,实际参数已经设置好了,但是方法的第一条指令还没有被调用?例如:
void method(int value) {
// [1]
int otherValue = otherMethod(value);
}
那么,线程可以暂停在[1]吗?
答案 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:
这些语义没有规定如何执行多线程程序。相反,它们描述了允许多线程程序展示的行为。任何只生成允许行为的执行策略都是可接受的执行策略。