-6

好吧,我想知道 java 如何处理代码读取和运行,例如,如果我写:

static void doSomething(){
    doSomethingElse();
    doYetAnotherThing();
}

它会在运行之前等待doSomethingElse()完成doYetAnotherThing()吗?还是两者都运行?

我猜如果它设置了一个变量,variable = setAVariable();它会在继续之前检索该变量,但如果该方法包含一个无限循环,它会卡住。

4

4 回答 4

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() 中的无限循环。

更新:

但是,如果你不能这样做并且仍然想运行上面的代码,你可以使用线程:

主类:public class 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();
}
}

包含所有功能的线程类: public class MyThread implements 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++);
    }
}
}

请注意:我提供的代码只是一个示例。我没有做任何错误处理或遵循推荐的标准。代码有效,就是这样。

于 2013-10-28T20:11:05.870 回答
0

这些是在一个线程中执行的同步调用,因此它们一个接一个地执行,即。先doSomethingElse();然后doYetAnotherThing();。如果您希望它们同时执行,您可以将它们放在不同的线程中,那么将无法保证顺序。

于 2013-10-28T20:07:08.257 回答
0

从逻辑上讲,程序将从上到下读取。作为一名程序员,这就是你真正需要知道的一切。然而,在幕后可能不一定如此。但是您可以保证结果就像它们按顺序运行一样。

有时你的处理器会运行一些甚至不应该被执行的代码行!这是因为称为分支预测的东西(对此答案有一个很好的解释,尽管不是java,但该想法在较低级别上得到了证明)。

同样,您可以假设同一线程中的所有内容都将按书面顺序执行。

于 2013-10-28T20:10:18.030 回答
0

规范中的一个清单在这里: http ://docs.oracle.com/javase/specs/jls/se5.0/html/execution.html

要点是一个函数必须在调用下一个函数之前返回。在不知道您的功能在做什么的情况下,我无法说出您的情况意味着什么。他们可能会返回,因为他们完成了,或者因为他们分叉/产生了另一个进程/线程/异步操作。这有更多的微妙之处,但我没有比这更进一步,因为它们过于复杂和混淆了答案。

根据您使用的术语,我建议从教程开始。Java 不会读取您的代码。Java是一种语言。编译器将“读取”并解析您的代码,并生成将由 JVM 执行的字节码。

是的,如果你导致一个无限循环,那就是一个问题,你的程序不会退出。

于 2013-10-28T20:22:07.837 回答