有什么区别 -
Thread workerThread = new Thread(runnable);
workerThread.start();
workerThread.sleep(5000);
.....
和
Thread workerThread = new Thread(runnable);
workerThread.start();
Thread.sleep(5000);
它们是否会导致工作线程暂停睡眠?
由于
答案 0 :(得分:8)
否 sleep是一种影响当前线程的静态方法:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep(long)
所以没有区别,他们都不会做你想要的。在实例上使用静态方法是不赞成不鼓励,因为它让你认为你可以做一些你实际上不能做的事情(比如在这种情况下)
小添加 - 请参阅John对why calling static methods from class instances is allowed in Java :-)
答案 1 :(得分:4)
sleep
是相同的静态方法,它会导致当前正在执行的线程休眠,而不是workerThread。
答案 2 :(得分:3)
唯一的实际电话是
Thread.sleep(5000);
另一个是Java的奇怪之处,你可以通过实例变量调用静态方法。
你应该总是使用
Thread.sleep(5000);
因为最好是自我记录,所以正在睡觉的当前线程“总是”。如果你这样做
myThread.sleep(5000);
你没有睡觉myThread线程,你正在睡觉当前线程。
答案 3 :(得分:0)
第二个应该是首选,因为Thread.sleep是一个静态方法,因此应该像所有静态方法一样,在定义它的类而不是在这个类的实例上调用它。
答案 4 :(得分:0)
这是另一种可能性。使用volatile标志将消息传递给C.
volatile boolean startC = false;
void B() {
// Do initial B work.
startC = true; // Set the volatile flag.
// Finish B processing not relevant to C.
}
void C() {
// Wait for B to progress far enough.
while (!startC) {
Thread.sleep(100);
}
// B has done enough work so we can begin.
}
这不是真正的代码,只是足以让你了解我的目标。例如,您需要注意startC标志的可见性,或者为它写一个公共getter和setter,这样B()和C()都可以访问。