我正在研究多线程,我有一个关于线程睡眠方法的问题。当我执行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();
}
}
}
结果:
睡觉了
extends Thread类已退出
睡了一些
主线程已执行
从结果我可以说,因为t2.sleep(10000)的睡眠时间超过SampleThread.sleep(1000)run()方法首先退出main方法。
但我的问题是时间多长。
Sleep由当前运行的线程调用,它不在线程对象上调用。所以你的睡眠里面运行方法暂停Sample线程,某个方法中的那个暂停你的主线程(启动程序的那个)。两个不同的执行过程。
sleep方法实际上是Thread的一个静态方法(你甚至会这样调用它),它应该已经告诉你,它不是“绑定”到线程对象。
你不能在同一个线程中调用两次睡眠,因为调用它必须被唤醒。没有可加性或优先级的问题。
所以在你的代码中,第二个线程启动,执行其run方法并暂停更短的时间。在此期间,主线程继续并暂停很长一段时间,而主线程休眠创建的线程完成其休眠然后终止。
你有两个不同的线程,彼此都没有阻塞。所以一个线程将等待10秒,另一个线程等待1秒。您等待的总时间取决于您关注的线程。
你的主要等待10秒,如果其他线程等待1秒或100万秒(如果第二个线程被设置为守护程序线程,那么它不会阻止当前的应用程序)。
如果您的主应用程序旋转一个守护程序的线程,它将不会退出,直到所有非守护程序线程完成。在这种情况下,您的主应用程序将完成其工作,然后在最后一行它将等待这些线程完成。
你不能在睡眠线程上执行sleep
,因为sleep
是一个静态方法,只能导致当前线程休眠。
t2.sleep(10000);
导致主线程休眠,而不是t2。它和Thread.sleep(10000)
一样。