我正在研究多线程,我有一个关于线程睡眠方法的问题。当我执行sleep()(用时间t1)方法已经处于休眠线程时(时间t2)。总睡眠时间是t1 + t2或t2(如果t2> t1)或t1(如果t1> t2):
代码:
我的主题类:
public class SampleThread extends Thread
{
public SampleThread(String msg)
{
super(msg);
start();
}
public void run()
{
try
{
SampleThread.sleep(1000);
System.out.
println("slept for run");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.
println("extends Thread Class is exited");
}
}
我的主要方法:
public class TestThreads {
public static void main(String[] args) {
SampleThread st = new SampleThread("Extends Thread");
some(st);
System.out.println("main thread Executed");
}
public static void some(SampleThread t2 ){
try {
t2.sleep(10000);
System.out.println("slept for some" );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:
睡觉跑步
扩展Thread类已退出
睡了一些
主线程已执行
从结果我可以说因为t2.sleep(10000)的休眠时间比SampleThread.sleep(1000)run()方法首先退出而不是main方法。
但我的问题是时间多长。
答案 0 :(得分:3)
当前正在运行的线程调用Sleep,它不会在线程对象上调用。所以你的睡眠里面运行方法暂停Sample线程,某个方法中的那个暂停你的主线程(启动程序的那个)。两个不同的执行过程。
sleep方法实际上是Thread的一个静态方法(你甚至可以这样调用它),它应该已经为你指出它没有“绑定”到线程对象。
你不能在同一个线程中调用两次睡眠,因为调用它必须被唤醒。没有可加性或优先级的问题。
因此,在您的代码中,第二个线程启动,执行其run方法并暂停更短的时间。与此同时,主线程继续并暂停很长一段时间,而主线程休眠创建的线程完成其休眠,然后终止。
答案 1 :(得分:1)
你有两个不同的线程,两个都没有阻塞。所以一个线程将等待10秒,另一个线程等待1秒。您等待的总时间取决于您关注的线程。
你的主等待10秒,如果另一个线程等待1秒或100万秒(如果第二个线程被设置为守护线程,那么它就不会关心当前的应用程序) )。
如果您的主应用程序旋转一个守护程序的线程,它将不会退出,直到所有非守护程序线程完成。在这种情况下,您的主应用程序将完成其工作,然后在最后一行,它将等待这些线程完成。
答案 2 :(得分:1)
您无法在休眠线程上执行sleep
,因为sleep
是静态方法,只能导致当前线程休眠。
t2.sleep(10000);
导致主线程休眠,而不是t2。它与Thread.sleep(10000)
相同。