java - java中的线程争用

标签 java multithreading concurrency

我试图理解下面的程序。如果我调用 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() 时,您是在同一个线程中执行的。它只是一个方法调用。

当您调用 start() 时触发另一个线程调用 run()

这是扩展线程不是一个好主意的原因之一,而是实现用线程包装的 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();
}

打印

Thread-0 - RUNNABLE

你能找出原因吗?

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

相关文章:

scala - scala.concurrent.blocking 的坏用例?

java - 在java中解决死锁的替代方法

java - 将 Jython PythonInterpreter 中的参数添加到 "execfile"函数

c - 指针解引用线程安全吗?

c - 如何在不使用互斥量的情况下在多个线程之间进行同步,以便它们的事务 ID 是唯一的?

c - Linux 中多线程的信号处理

java - GUI 测试应该以默认外观运行吗?

java - Spring - @Value 返回 null

java - 为什么 JavaScript 被称为 JavaScript,因为它与 Java 无关?

c++ - 从 C++11 中的另一个线程解锁一个线程