已休眠线程上的 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)
.
相同
我正在研究多线程,我有一个关于线程休眠方法的问题。当我在已经处于睡眠状态的线程(时间为 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)
.