线程的睡眠与唤醒Thread.sleep()与interrput()

Thread.sleep()方法

当我们需要使一个线程进入睡眠的时候,那么我们就需要使用到sleep()方法。sleep()方法是一个静态方法,调用时,我们只需要直接使用 “类名.sleep()” 就可以调用该方法。

Thread.sleep(long millis)方法的参数是一个long类型的毫秒数

代码效果如下:

public class Test{
	public static void main (String[] args){
		
		//使main线程睡眠5秒后打印Hello World
		try{
			Thread.sleep(1000 * 5);//此处表示1000毫秒 * 5 = 5秒
		}catch(InterruptedException e){
			e.printStackTrace();
		}
		System.out.println("Hello World!");
	}
}

通过以上代码,我们可以使我们的main线程延迟5秒来打印Hello World语句.

该方法只用于当前调用者:
如果是将sleep()方法写在A线程下,那么调用该方法的就是A线程
如果是将sleep()方法写在B线程下,那么调用该方法的就是B线程
sleep()方法无法使用对象名来调用方法,使用对象名调用即使不出现错误也会在底层运行时也会转换为Thread.sleep().

Thread.interrupt()方法

 当我们的线程睡眠时间太长,我们需要提前唤醒睡眠的线程时,我们可以使用Thread.interrupt()方法.
 此方法表示中断这个线程。但是在我们的实际运用当中,interrupt()方法可以实现终止线程的睡眠,提前唤醒线程.

代码如下:
 我采用了内部类的方式创建线程.

public class Test{
	public static void main (String[] args){
		Thread thread = new Thread(new Runnable(){
			public void run(){
				System.out.println(Thread.currentThread().getName() + "----> Begin");

				try{
					Thread.sleep(1000 * 60 * 60);//使线程进入一个24小时的长时间睡眠	
				}catch(InterruptedException e){
					e.printStackTrace();
				}
				
				System.out.println(Thread.currentThread().getName() + "----> End");
			}
		});
		
			
			//启动线程
			thread.start();
			
			//将长时间睡眠的线程,5秒后唤醒
			try{
				Thread.sleep(1000 * 5);
			}catch(InterruptedException e){
				e.printStackTrace();
			}

			//唤醒线程
			thread.interrupt();

	}
}

在以上代码中,我们的interrupt()方法用于干扰线程的睡眠,但是不会终止线程.
当我们的代码运行到interrupt()方法时,在底层会时另一个线程中的睡眠方法产生异常,catch正常捕捉异常后打印异常信息,try…catch运行正常结束,继而运行下面的代码.

值得注意的是:在我们启动线程后的sleep()方法是使当前线程(即main线程)睡眠5秒后唤醒,内部类中的线程!!

本人也是刚刚学习起步的小白,借CSDN平台记录一些自己容易忘记的内容.
如果文中有错误,那么希望您能联系我刚创建的公众号,或者直接私信我改正
线程的睡眠与唤醒Thread.sleep()与interrput()_第1张图片

你可能感兴趣的:(java,java,多线程,thread)