java中的线程争用

Raj*_*Raj 3 java concurrency multithreading

我想了解下面的程序.如果我调用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;

    }

}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 11

当你打电话时,你run()在同一个线程中这样做.它只是一个方法调用.

当你打电话start()给另一个线程来触发时run()

这是扩展Thread不是一个好主意的原因之一,而是实现了用线程包装的Runnable.这是许多混淆的潜在来源之一.


这是一个相关的预告片

static String name = "Peter Lawrey";
static String state = "Washington";

static String getName() {
  return name;
}

static String getState() {
  return state;
}

static class NamedThread extends Thread {
  @Override
  public void run() {
    System.out.println(getName()+" - "+getState());
  }
}

public static void main(String... args) throws InterruptedException {
  new NamedThread().start();
}
Run Code Online (Sandbox Code Playgroud)

版画

Thread-0 - RUNNABLE
Run Code Online (Sandbox Code Playgroud)

你能找出原因吗?

  • 同时为厚颜无耻和有教育意义的+1 (2认同)