我试图理解下面的程序。如果我调用 new ReaderThread().start() 它工作正常,但如果我调用 new ReaderThread().run() ,应用程序进入无限循环。有什么区别?

public class Contention {

    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {
        public void run() {
                 while (!ready){
                System.out.println("ready ..."+ready);
                Thread.yield();}
            System.out.println(number);
           // }
        }
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ReaderThread().run();
        number = 42;
        ready = true;

    }

}

最佳答案

如果你使用 new ReaderThread().start(); ,你实际上是在创建一个新的线程实例,它将在后台运行并且 main() 继续执行它的进一步执行。

但是 new ReaderThread().run(); 创建了此类的一个实例并对 run() 方法进行了正常的方法调用,因此 main() 必须等到 run() 完成执行并将控制权返回给 main(),在您的情况下,这是一个无限循环。

如果您想启动一个新线程,然后使用 ReaderThread().start(); 启动,这是启动线程的正确方法,没有其他选择。

关于java - java中的线程争用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7349010/

10-12 14:18