已休眠线程上的 Sleep() 方法

Sleep() method on already sleeping thread

我正在研究多线程,我有一个关于线程休眠方法的问题。当我在已经处于睡眠状态的线程(时间为 t2)上执行 sleep()(时间为 t1) 方法时。总休眠时间为 t1+t2 或 t2(如果 t2 > t1)或 t1(如果 t1 > t2):

代码:

我的话题class:

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

结果:

睡了 运行

扩展线程 Class 已退出

睡了一会儿

主线程已执行

从结果我可以说因为 t2.sleep(10000) 的休眠时间比 SampleThread.sleep(1000) 运行() 方法比 main 方法先退出。

但我的问题是多少时间。

你有两个不同的线程,并且没有一个互相阻塞。所以一个线程将等待 10 秒,另一个等待 1 秒。您等待的总时间取决于您关心的线程。

您的主线程等待了 10 秒,它不关心另一个线程等待 1 秒还是一百万秒(如果第二个线程被设置为守护线程,那么它不会阻塞当前应用程序)。

如果您的主应用程序启动了一个守护进程线程,它将在所有非守护进程线程完成之前不会退出。在这种情况下,您的主应用程序将完成其工作,然后在最后一行等待这些线程完成。

Sleep 由当前 运行ning 线程调用,而不是在线程对象上调用。因此,您在 运行 方法中的 sleep 方法会暂停 Sample 线程,某些方法中的方法会暂停您的主线程(启动程序的线程)。两种不同的执行流程。

sleep 方法实际上是 Thread 的一个静态方法(您甚至这样称呼它),这应该已经向您表明,它不是线程对象的 'bound'。

不能在同一个线程中两次调用sleep,因为调用它必须被唤醒。不存在可加性或优先级问题。

因此在您的代码中,第二个线程启动,执行其 运行 方法并暂停更短的时间。同时,主线程继续并暂停很长时间,而主线程休眠创建的线程完成休眠然后终止。

不能在休眠线程上执行sleep,因为sleep是静态方法,只能使当前线程休眠。

t2.sleep(10000); 导致主线程休眠,而不是 t2。与 Thread.sleep(10000).

相同