我正在试着理解下面的程序。如果我调用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;
}
}发布于 2011-09-08 22:35:10
如果您使用new ReaderThread().start();,您实际上是在创建一个新的线程实例,该实例将在后台运行,并且main()将继续其进一步的执行。
但是new ReaderThread().run();创建了该类的一个实例,并对run()方法进行了正常的方法调用,因此main()必须等待,直到run()完成执行并将控制返回给main(),在您的例子中,这是一个无限循环。
如果你想启动一个新的线程,然后使用ReaderThread().start();启动,这是正确的启动线程的方法,没有替代方法。
发布于 2011-09-08 21:44:56
当您调用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();
}打印
Thread-0 - RUNNABLE你能找出原因吗?
发布于 2011-09-08 21:45:49
run()只是一个不会启动新线程的方法,所以main()永远不会将ready设置为true。
实际上,只有start()会产生一个单独的执行线程--这正是您所需要的。
请注意,即使这样,由于内存模型的考虑,您的代码也不能保证正常工作-您需要担心对共享数据所做更改的可见性。
https://stackoverflow.com/questions/7349010
复制相似问题