睡眠线程上的Sleep()方法

时间:2015-03-22 00:32:09

标签: java multithreading sleep

我正在研究多线程,我有一个关于线程睡眠方法的问题。当我执行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方法。

但我的问题是时间多长。

3 个答案:

答案 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)相同。