在一个线程上调用sleep正在睡眠所有线程(Java)

时间:2014-11-17 05:32:22

标签: java multithreading

我有一个工人向量,每个都有自己的线程,如下:

for (int i = 0; i < numWorkers; i++)
    {
        workers.addElement(new Worker(this, i));
        Thread t = new Thread(workers.elementAt(i));
        workerThreads.addElement(t);
        t.start();
    }

每个工作者在向量中都有它的编号,当我需要停止一个线程时,我这样做:

fp.workerThreads.elementAt(number).sleep(move.amount*1000);

然而,即使我认为我在单个线程上调用sleep,它也会停止向量中的所有工作线程。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

所以你要做的就是从主线程调用你的一个worker对象上的sleep。

fp.workerThreads.elementAt(number).sleep(move.amount*1000);

如果你必须睡在你的一个工作线程中。您必须确保从正在尝试进入休眠状态的线程调用Thread.sleep()方法。正如您所看到的,Thread.sleep是一个静态方法,它不关心您调用睡眠的哪个线程对象,但它是您当前的线程。我希望这会有所帮助。

答案 1 :(得分:0)

这在技术上不是错误,但它太可怕了:

Thread t = ...;
...
t.sleep();

不是&#34;错误&#34;因为编译器会让你这样做。它太可怕了,因为它具有误导性:看起来程序员认为sleep()调用会触发。但这根本不是真的。

IMO这是Java语言的设计者在你写这篇文章时犯下的最大错误之一。如果您的程序要打电话给睡眠*,那么就这样做:

Thread.sleep();

*但为什么要打电话给sleep()呢?除非它用于教育目的,调用Thread.sleep()的Java程序要么包含一个重新发明的轮子,要么它因为一些不恰当的原因而睡觉。 (提示:如果您的程序存在同步问题,则无法使用sleep()进行修复。您所能做的就是在测试过程中发现问题的可能性更小,因此更有可能发生在最终确实发生的领域。)