我有一个工人向量,每个都有自己的线程,如下:
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,它也会停止向量中的所有工作线程。有任何想法吗?谢谢!
答案 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()进行修复。您所能做的就是在测试过程中发现问题的可能性更小,因此更有可能发生在最终确实发生的领域。)