我对Thread.sleep()的工作原理有点困惑:
1.如果我在main方法中调用它,并且有其他创建的线程正在运行。它会暂停什么:是单独的主线程还是所有的子线程(将它们视为主线程的一部分)?例如:
public static void main(String arg[])
{
Thread t1 = new Thread();
t1.start();
Thread.Sleep(1000);
}
1.如果我在一个线程的run()
方法内部调用sleep()
方法,当在main内部为该线程调用start()
方法时,它是否也会暂停其他线程?因为我就发生过这种情况......尽管我知道在这种情况下它应该只暂停内部调用的线程。例如:
//thread Tester has a sleep() in its run() while NoSleep doesn't have
public static void main(String arg[])
{
Tester t1 = new Tester();
NoSleep t2 = new NoSleep();
t1.start();
t2.start();
}
在这样的代码中,t2
和t1
都暂停了,我不明白为什么。
4条答案
按热度按时间bttbmeg01#
在Java中,线程都是平等的对等体,没有分组、父子关系或所有权。
所以休眠任何一个线程对其他线程没有直接影响。
调用
Thread.sleep
会使执行该方法的任何线程休眠。非常简单,没有更多的解释。正如
Thread.sleep
Javadoc所说:使当前执行的线程休眠(暂时停止执行)指定的毫秒数
顺便说一下,在现代Java中,我们很少需要直接寻址
Thread
类。相反,我们使用执行器服务来执行Runnable
或Callable
任务。因此不需要调用new Thread
。也不需要从Thread
扩展。ee7vknir2#
sleep()暂停正在执行代码的当前线程,它对其他线程没有影响。该线程可以是“主”线程或从主线程派生(启动)的线程。
Thread.睡眠()不是实现异步任务的方法,比如通过Thread.sleep挂起某个线程等待(),然后猜测经过那么长时间后我可以恢复我的线程,并希望事件必须已经完成,您的睡眠线程正在等待。您将使用一些低级机制,如notify,wait,notifyAll。而不是使用Semaphores,倒计时锁存器和其他更好的 Package 器建议在其他答案。评论下面的更多信息或疑问,你有,很乐意帮助
zbsbpyhn3#
Thread.sleep()
是Java中许多名字很糟糕的东西之一。* 不要认为它“睡眠”任何线程。有一种更简单的方法来考虑它:Thread.sleep(n)
什么都不做。它至少在
n
毫秒内不做任何事情,然后返回。这就是您需要了解的关于sleep()
的全部内容(至少,在您成为Java运行时环境的维护者之前,您需要了解的全部内容)。m528fe3b4#
我知道我迟到了,但要明确地回答你的问题-
Thread.sleep(n)
,其中n是毫秒,导致当前线程睡眠,不影响其他线程。1.如果你在main方法中调用
Thread.sleep(1000)
,如下所示,你的主线程将休眠1秒,而其他线程将继续运行。输出-
1.现在,当您在run方法中调用
Thread.sleep(n)
时,它会导致该线程休眠,而包括主线程在内的其他线程不受影响。在这里,
SleepTask Thread
会在打印完每一行后暂停1秒。而其他线程,如WithoutSleepTask Thread
和Main Thread
会继续执行。这里是输出-
因此,在您的示例中,
t1
应该处于休眠状态,而t2
应该正常执行。