睡眠线程上的Sleep()方法

问题描述 投票:0回答:3

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

但我的问题是时间多长。

java multithreading sleep
3个回答
3
投票

Sleep由当前运行的线程调用,它不在线程对象上调用。所以你的睡眠里面运行方法暂停Sample线程,某个方法中的那个暂停你的主线程(启动程序的那个)。两个不同的执行过程。

sleep方法实际上是Thread的一个静态方法(你甚至会这样调用它),它应该已经告诉你,它不是“绑定”到线程对象。

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

所以在你的代码中,第二个线程启动,执行其run方法并暂停更短的时间。在此期间,主线程继续并暂停很长一段时间,而主线程休眠创建的线程完成其休眠然后终止。


1
投票

你有两个不同的线程,彼此都没有阻塞。所以一个线程将等待10秒,另一个线程等待1秒。您等待的总时间取决于您关注的线程。

你的主要等待10秒,如果其他线程等待1秒或100万秒(如果第二个线程被设置为守护程序线程,那么它不会阻止当前的应用程序)。

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


1
投票

你不能在睡眠线程上执行sleep,因为sleep是一个静态方法,只能导致当前线程休眠。

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

© www.soinside.com 2019 - 2024. All rights reserved.