带有break语句的无限while循环

时间:2014-06-14 13:59:19

标签: java android loops infinite-loop

我是初学者,我正在分析这个java代码:

// t is a thread running
while (true) {
    try {
        t.join(); 
    } catch (InterruptedException e) { e.printStackTrace(); }
    break;
}
t=null;

我要问的是:是否需要将其置于无限循环中?因为我看到循环只运行一次,即由于break语句。我需要一些解释。

5 个答案:

答案 0 :(得分:3)

不,没有必要。你的观察是正确的,循环只会被执行一次。

所以OP发布的代码等同于以下代码。

// t is a thread running
try {
    t.join(); 
} catch (InterruptedException e) { e.printStackTrace(); }
t=null;

OP发布的代码:

// t is a thread running
while (true) {
    try {
        t.join(); 
    } catch (InterruptedException e) { e.printStackTrace(); }
    break;
}
t=null;

答案 1 :(得分:1)

正如大家已经指出的那样,代码是不正确的。

循环,但必要

正确的代码如下所示:

while (true) {
    try {
        t.join();
        break; 
    } catch (InterruptedException e) { e.printStackTrace(); }
}
t = null;

如果没有循环,可以将<{1}}设置为null,当前线程成功加入之前。

答案 2 :(得分:0)

t.join();等待线程的完成。
在那之后,你的“休息”打破了循环 =&GT;总是只循环1次=&gt;不需要循环和中断,只需要t.join();

答案 3 :(得分:0)

不需要有一个while循环,因为t.join()等待线程死掉。 就像一个循环,在t.join()行的程序中,当线程没有死时,程序将被阻止。

正确的代码是:

// t is a thread running
    try {
        t.join(); 
    } catch (InterruptedException e) { e.printStackTrace(); }

    t=null;

这里有一个例子:

http://www.tutorialspoint.com/java/lang/thread_join.htm

答案 4 :(得分:0)

不需要循环! 据说线程t已经开始了。因此没有意义“t = null”。线程t已经启动,它将完成其工作。您可以在没有while循环的情况下使用t.join()。在这种情况下,while循环没有意义。 join方法允许一个线程等待另一个线程的完成。如果t是其当前正在执行其线程的Thread对象,则

t.join();

导致当前线程(下面的示例中的主线程)暂停执行,直到t的线程终止。运行以下代码片段并知道绳索。

public class Main {

public static void main(String[] args) {

    Thread t=new Thread(
         new Runnable() {
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(Thread.currentThread().getName()+"--"+i);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });

    t.start();

    try {
        t.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    t = null;  // no sense, t is already started

    for (int i = 0; i < 100; i++) {
        System.out.println(Thread.currentThread().getName()+"--Thread--"+i);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}