在一个线程上调用sleep就是在睡眠我的所有线程(Java)

在一个线程上调用sleep就是在睡眠我的所有线程(Java),java,multithreading,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(); } 然而,即使我认为我在

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

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();
    }

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

因此,您在这里尝试的是从主线程调用一个worker对象上的sleep

fp.workerThreads.elementAt(number).sleep(move.amount*1000);
如果您必须在工作线程中睡觉。您必须确保您正在从试图进入睡眠状态的线程调用Thread.sleep()方法。正如您所看到的,Thread.sleep是一个静态方法,它不关心您在哪个线程对象上调用sleep,而是关心您当前的线程。我希望这能有所帮助。

从技术上讲,这并不是错的,但它很可怕:

Thread t = ...;
...
t.sleep();
这不是“错”,因为编译器会让你这么做。这很可怕,因为它具有误导性:看起来程序员认为sleep()调用会对线程t产生影响。但事实并非如此

在我看来,这是Java语言设计者在让您编写时犯的最大错误之一。如果您的程序将调用sleep*,请按如下方式执行:

Thread.sleep();


*但为什么要调用sleep()呢?除非出于教育目的,否则调用Thread.sleep()的Java程序要么包含一个重新发明的轮子,要么由于某些不适当的原因而休眠。(提示:如果您的程序存在同步问题,则无法使用sleep()修复。您所能做的就是降低在测试过程中发现该问题的可能性,从而在最终发生时在字段中发现该问题的可能性更大。)

所有线程都处于睡眠状态的指示是什么?他们运行的指示是什么?所有这些代码都显示了您是如何创建工作人员列表的,但我们不知道有关工作人员的任何信息,也不知道您是如何使用这些工作人员的。不,不是。您从看到的症状中得出了错误的结论。我知道Thread.sleep()是静态的,这就是为什么我有一个工作线程数组,并且我正在该向量中的特定元素上调用sleep()。这就是你的意思吗?如果Thread.sleep是静态的,那么对于所有线程对象只有一个方法。如果你在任何对象上调用它,这没有任何区别。sleep()不知道哪个线程对象正在调用sleep。它将使调用该方法的线程休眠。因此,在你的情况下,我认为你是从主线程调用它。这就是主线程处于休眠状态的原因您不能对特定对象调用sleep(),确切地说是因为休眠是静态的。如果始终在类上调用,则为静态方法。Java允许您使用该类的对象而不是类本身进行调用(这是一个相当令人困惑的特性),但是调用会忽略该对象。(它必须忽略对象,因为静态方法没有“this”引用。)通常,当您这样调用它时,编译器会发出警告(依我看,这可能是语言规范中的错误)。换一种说法,上面的代码与Thread.sleep()完全相同。请检查此线程
Thread.sleep();