Java 已休眠线程上的Sleep()方法
我正在研究多线程,我有一个关于线程睡眠方法的问题。当我在已经处于睡眠状态的线程(时间为t2)上执行sleep()(时间为t1)方法时。总睡眠时间为t1+t2或t2(如果t2>t1)或t1(如果t1>t2): 代码: 我的线程类: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
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方法。你的