静态地使用线程而不是使用其实例

时间:2011-04-30 16:24:45

标签: java multithreading

有什么区别 -

Thread workerThread = new Thread(runnable);
workerThread.start();
workerThread.sleep(5000);
.....

Thread workerThread = new Thread(runnable);
workerThread.start();
Thread.sleep(5000);

它们是否会导致工作线程暂停睡眠?

由于

5 个答案:

答案 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()都可以访问。