多线程关键字之sleep

本文探讨了Java中的Thread.sleep方法,该方法用于阻塞当前线程并释放锁。介绍了sleep(long)方法的用法,推荐使用TimeUnit.SECONDS.sleep(1)的写法。还提供了一个每隔一秒更新显示的倒计时案例。当线程休眠时,可通过interrupt方法提前唤醒,但不会释放已获取的锁。

sleep:

在Thread 类中定义的静态方法,可以阻塞当前线程

特征:不释放已经获取到的锁

sleep原函数--

public static native void sleep(long millis) throws InterruptedException

public static void sleep(long millis, int nanos)throws InterruptedException

sleep(long):让当前线程休眠等待指定的时间,时间单位为ms。休眠时间的准确性依赖于操作系统时钟和CPU 调度机制

目前比较流行的写法为TimeUnit.SECONDS.sleep(1) 等价于Thread.sleep(1000)

注意:如果需要可以通过interrupt 方法来唤醒休眠的线程

案例:

实现一个时间显示,每隔一秒钟更新一次显示。例如倒计时显示

题目分析:DateFormat 用于实现日期时间的格式化date--string 或者解析string--date
如果需要使用自定义格式,一般使用SimpleDateFormat

public class Test01 {
	public static void main(String[] args) {
		DateFormat df=new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
		for(;;) {//相当于while(true)
			Date now=new Date();
			String ss=df.format(now);
			System.out.println(ss);
			//Thread.sleep(1000)--休眠1000毫秒
			try {
				TimeUnit.SECONDS.sleep(1);//--等价于Thread.sleep(1000)
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

 运行结果:

 如何提前唤醒休眠的线程:

当线程进入休眠态时,它会定时结束休眠(注意时间不是很靠谱,因为休眠时间需要依靠系统时间和调度器),如果需要提前唤醒,则需要通过interrupt 方法实现,所谓的interrupt 就是产生一个异常InterruptedException

 

public class Test02 {
	public static void main(String[] args) throws InterruptedException {
		DateFormat df=new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
		Thread t1=new Thread(()-> {
		for(;;) {//相当于while(true)
			Date now=new Date();
			String ss=df.format(now);
			System.out.println(ss);
			try {
				//Thread.sleep(1000)--休眠1000毫秒
				TimeUnit.SECONDS.sleep(10);//--等价于Thread.sleep(1000)
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		});
		t1.start();
		Thread.sleep(200);
		t1.interrupt();
		System.out.println("main.....end");
	}
}

重点:不会释放已经获取到的锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值