假设我有一些代码:
public int doSomething(int x)
{
otherMethod(x);
System.out.println("otherMethod is complete.");
return 0;
}
public void otherMethod(int y)
{
//method body
}
由于otherMethod的返回类型无效,doSomething
方法如何知道otherMethod
何时完成,因此它可以转到下一个,并打印“otherMethod
已完成。”?
编辑:将return 0;
添加到doSomething方法,以便编译示例代码。
答案 0 :(得分:14)
解析器知道执行结束的位置,甚至添加一个返回值,例如:
public static void main(String args[]) {
}
汇编为:
public static main([Ljava/lang/String;)V
L0
LINENUMBER 34 L0
RETURN <------ SEE?
L1
LOCALVARIABLE args [Ljava/lang/String; L0 L1 0
MAXSTACK = 0
MAXLOCALS = 1
}
这同样适用于您的代码(尽管我已经在返回0中添加了代码,因为您的代码无法编译):
public int doSomething(int x)
{
otherMethod(x);
System.out.println("otherMethod is complete.");
return 0;
}
public void otherMethod(int y)
{
//method body
}
编译代码:
public doSomething(I)I
L0
LINENUMBER 38 L0
ALOAD 0
ILOAD 1
INVOKEVIRTUAL TestRunner.otherMethod (I)V
L1
LINENUMBER 39 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "otherMethod is complete."
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L2
LINENUMBER 40 L2
ICONST_0
IRETURN
L3
LOCALVARIABLE this LTestRunner; L0 L3 0
LOCALVARIABLE x I L0 L3 1
MAXSTACK = 2
MAXLOCALS = 2
// access flags 0x1
public otherMethod(I)V
L0
LINENUMBER 46 L0
RETURN <-- return inserted!
L1
LOCALVARIABLE this LTestRunner; L0 L1 0
LOCALVARIABLE y I L0 L1 1
MAXSTACK = 0
MAXLOCALS = 2
}
答案 1 :(得分:1)
由于结束括号。一旦线程到达方法的末尾,它将返回。另外,程序员可以通过写入来指定何时完成void方法
return;
编辑:我把问题搞砸了。 Thread一次执行一个方法,一次一个语句,所以一旦线程完成一个方法,它将转到调用方法的下一行。