好吧,我想知道java如何处理代码读取和运行,例如,如果我写了:
static void doSomething(){
doSomethingElse();
doYetAnotherThing();
}
它会在doSomethingElse()
运行之前等待doYetAnotherThing()
完成吗?或者它会同时运行吗?
我想如果它设置了一个变量variable = setAVariable();
,它会在继续之前检索变量,但是如果该方法包含一个无限循环,它就会卡住。
答案 0 :(得分:1)
Java将按顺序运行您的代码,除非您另有说明(通过创建线程。)
如果你在函数doSomthingElse()中使用了无限循环,则doYetAnotherThing()将永远不会执行,doSomething将永远不会终止。
public static void main(String[] args)
{
doSomethingElse();
doYetAnotherThing();
}
private static void doYetAnotherThing() {
System.out.println("Hi Agn");
}
private static void doSomethingElse() {
System.out.println("Hi");
while(true) // Infinite Loop
{
}
}
这将打印输出:
Hi
但不是:嗨Agn。
要使两个函数都运行,您需要删除doSomethingElse()中的无限循环。
更新:
但是,如果你不能这样做并仍想运行上面的代码,你可以使用线程:
主要类别:
公共类javaworking
{
static MyThread t1,t2;
线程tc;
public static void main(String[] args)
{
t1 = new MyThread(1);
Thread tc = new Thread(t1);
tc.start();
t2 = new MyThread(2);
tc = new Thread(t2);
tc.start();
}
}
包含所有函数的线程类: 公共类MyThread实现了Runnable {
int ch;
public MyThread(int choice)
{
ch = choice;
}
@Override
public void run() {
// TODO Auto-generated method stub
switch(ch)
{
case 1:
doSomethingElse();
break;
case 2:
doYetAnotherThing();
break;
default:
System.out.println("Illegal Choice");
break;
}
}
private static void doYetAnotherThing() {
// TODO Auto-generated method stub
System.out.println("Hi Agn");
}
private static void doSomethingElse() {
// TODO Auto-generated method stub
System.out.println("Hi");
int i = 1;
while(true)
{
System.out.println(i++);
}
}
}
请注意:我提供的代码仅仅是一个例子。我没有做任何错误处理或遵循建议的标准。代码有效,就是这样。
答案 1 :(得分:0)
这些是在一个线程中执行的同步调用,因此它们一个接一个地执行,即。先doSomethingElse();
然后doYetAnotherThing();
。如果你想让它们同时执行,你可以把它们放在不同的线程中,那么订单将无法保证。
答案 2 :(得分:0)
逻辑上,程序将从上到下阅读。作为一个程序员,你真正需要知道的。但是,在幕后可能不一定是这种情况。但是你可以保证结果就好像顺序运行一样。
有时您的处理器会运行甚至从未执行过的代码行!这是因为一些叫做分支预测的东西(对this答案有一个很好的解释,虽然不是java这个想法在较低层次上得到了证明)。
同样,您可以假设同一个线程中的所有内容都将以书面顺序执行。
答案 3 :(得分:0)
规范中的一个列表在这里: http://docs.oracle.com/javase/specs/jls/se5.0/html/execution.html
要点是一个函数必须在调用下一个函数之前返回。在你不知道你的功能在做什么的情况下,我无法说出你的意思。他们可以返回,因为他们完成或因为他们分叉/产生了另一个进程/线程/异步操作。这有更多的细微之处,但我没有比这更进一步,因为他们过于复杂和模糊了答案。
根据您使用的术语,我建议从教程开始。 Java不会读取您的代码。 Java是一种语言。编译器将“读取”并解析您的代码,并生成将由JVM执行的字节码。
是的,如果你造成一个无限循环,那就是一个问题,你的程序也不会退出。