首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的线程争用

java中的线程争用
EN

Stack Overflow用户
提问于 2011-09-08 21:42:11
回答 6查看 1.1K关注 0票数 3

我正在试着理解下面的程序。如果我调用new ReaderThread().start(),它可以正常工作,但如果我调用new ReaderThread().run(),应用程序将进入无限循环。有什么关系?

代码语言:javascript
复制
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;

    }

}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-08 22:35:10

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

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

如果你想启动一个新的线程,然后使用ReaderThread().start();启动,这是正确的启动线程的方法,没有替代方法。

票数 2
EN

Stack Overflow用户

发布于 2011-09-08 21:44:56

当您调用run()时,您可以在同一线程中执行此操作。这只是一个方法调用。

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

这就是为什么扩展Thread不是一个好主意的原因之一,而是实现Runnable,你用一个线程包装它。这是造成混乱的众多潜在原因之一。

这里有一个相关的预告

代码语言:javascript
复制
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();
}

打印

代码语言:javascript
复制
Thread-0 - RUNNABLE

你能找出原因吗?

票数 11
EN

Stack Overflow用户

发布于 2011-09-08 21:45:49

run()只是一个不会启动新线程的方法,所以main()永远不会将ready设置为true

实际上,只有start()会产生一个单独的执行线程--这正是您所需要的。

请注意,即使这样,由于内存模型的考虑,您的代码也不能保证正常工作-您需要担心对共享数据所做更改的可见性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7349010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档