为什么主线程在继续执行之前要等待另一个线程完成?

4

我在一个复杂的Java应用程序中遇到的问题归结为以下几点:主线程不会继续执行,直到子线程完成,尽管我认为它应该这样做。下面是说明问题的代码:

public class ThreadTest {

        static class MyThread extends Thread{
            public void run(){
                for(double i = 0; i<1; i+=0.01){
                    System.out.println(Math.pow(Math.PI,Math.E)*100.0*i-234.0);
                }
            }
        }

        public static void main(String[] args){
            (new MyThread()).run();
            System.out.println("main thread");
        }
    }

当我运行这个程序时,无论循环中有多少步骤,我总是先收到MyThread的输出,然后才收到主线程的消息。创建线程的想法是异步执行代码,但在这里我观察到明显的同步行为。我错过了什么吗?
提前感谢!

3
当您找到一个满意的答案时,礼貌的做法是接受它。有时候值得等待看看是否会出现更好的答案,但这取决于您自己。 - Peter Lawrey
当然,非常感谢!我实际上对于start和run感到困惑。 - Tim
暴露run()方法很令人困惑。实际上,线程(Thread)不应该有一个run()方法,而应该使用Runnable接口,这是最佳实践之一。 - Peter Lawrey
1个回答

12

当你调用run()方法时,你是在当前线程中调用run()方法!这与你为另一个对象调用任何其他方法的方式相同。

如果你想让一个新线程调用run()方法,你需要在该线程上调用start()方法。

try

new MyThread().start();

你可以通过在调试器中逐步执行程序来证明这一点,这将显示只有一个线程。


我一点头绪都没有,但我的线程启动在一个while循环中。我希望线程能在while循环中完成它们的工作。但不知怎么回事,主程序会跳过while循环,这会导致程序产生错误的结果。你的答案救了我一天。 - Umesh Moghariya
答案确实解决了这个问题,但它并没有提供更清晰的信息来解释为什么主线程要等待所有其他线程完成。 - Ashish Kamble
1
@AshishKamble,无论您使用run()还是start(),主线程都不会等待。如果您使用run(),则主线程将调用并运行run()中的代码,因此不会发生等待。如果您调用start(),则另一个线程将被使用,而主线程仅等待足够长的时间来触发另一个线程的创建,但不会等待该线程运行。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接