Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 已休眠线程上的Sleep()方法_Java_Multithreading_Sleep - Fatal编程技术网

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

Java 已休眠线程上的Sleep()方法,java,multithreading,sleep,Java,Multithreading,Sleep,我正在研究多线程,我有一个关于线程睡眠方法的问题。当我在已经处于睡眠状态的线程(时间为t2)上执行sleep()(时间为t1)方法时。总睡眠时间为t1+t2或t2(如果t2>t1)或t1(如果t1>t2): 代码: 我的线程类: public class SampleThread extends Thread { public SampleThread(String msg) { super(msg); start(); } pu

我正在研究多线程,我有一个关于线程睡眠方法的问题。当我在已经处于睡眠状态的线程(时间为t2)上执行sleep()(时间为t1)方法时。总睡眠时间为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();
        }
    }    
}  
结果:

睡觉跑步

已退出扩展线程类

睡了一会儿

执行主线程

从结果中我可以说,因为t2.sleep(10000)的睡眠时间比SampleThread.sleep(1000)run()方法比main方法先退出


但我的问题是要花多少时间

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

主线程等待了10秒,它不在乎其他线程是等待1秒还是一百万秒(如果第二个线程被设置为守护进程线程,这样它就不会阻止当前应用)


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

您有两个不同的线程,两个线程都不会相互阻塞。因此,一个线程将等待10秒,另一个线程将等待1秒。您等待的总时间取决于您关心的线程

主线程等待了10秒,它不在乎其他线程是等待1秒还是一百万秒(如果第二个线程被设置为守护进程线程,这样它就不会阻止当前应用)


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

睡眠由当前运行的线程调用,而不是在线程对象上调用。因此,您的sleep-inside-run方法暂停示例线程,some方法中的方法暂停主线程(启动程序的线程)。两个不同的执行过程

sleep方法实际上是线程的一个静态方法(您甚至可以这样调用它),它应该已经为您指明它没有“绑定”到Thread对象

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


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

睡眠由当前运行的线程调用,而不是在线程对象上调用。因此,您的sleep-inside-run方法暂停示例线程,some方法中的方法暂停主线程(启动程序的线程)。两个不同的执行过程

sleep方法实际上是线程的一个静态方法(您甚至可以这样调用它),它应该已经为您指明它没有“绑定”到Thread对象

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


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

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


t2.睡眠(10000)导致主线程休眠,而不是t2。这与
线程相同。sleep(10000)

您不能在睡眠线程上执行
睡眠
,因为
睡眠
是一种静态方法,只能导致当前线程睡眠


t2.睡眠(10000)导致主线程休眠,而不是t2。这与线程相同。睡眠(10000)

谢谢你的回答。因此,除了执行包含sleep()的run方法外,我无法从main方法停止t2线程(它是示例线程obj st)。停止还是暂停?停止像终止它,暂停像临时中断它的执行?很抱歉,我的意思是暂停与睡眠方法不你不能睡眠任意线程,但如果你是负责代码,你可以提供一个逻辑,这样做。您可以在SampleThread中有字段requestedSleep,在run方法中(通常会包含一些循环,否则它只会通过并终止),您可以继续检查requestedSleep是否>0,如果是,则调用sleep方法。如果主线程希望向其子线程发出进入睡眠状态的信号,则设置requestedSleep值。另一种“暂停”线程的方法是调用某个对象上的等待(或使用锁和条件),直到满足某个允许工作的条件。一旦控制线程决定工作线程应该继续工作,它就会在对象上调用NOTIFY来“唤醒”线程。谢谢你的回答。因此,除了执行包含sleep()的run方法外,我无法从main方法停止t2线程(它是示例线程obj st)。停止还是暂停?停止像终止它,暂停像临时中断它的执行?很抱歉,我的意思是暂停与睡眠方法不你不能睡眠任意线程,但如果你是负责代码,你可以提供一个逻辑,这样做。您可以在SampleThread中有字段requestedSleep,在run方法中(通常会包含一些循环,否则它只会通过并终止),您可以继续检查requestedSleep是否>0,如果是,则调用sleep方法。你的