线程休眠、线程休眠应用场景
线程休眠sleep
- sleep指定当前线程阻塞的毫秒数,1000ms=1s
- sleep存在异常InterruptedException
- sleep时间达到后线程进入就绪状态
- sleep可以模拟网络延时、倒计时等
- 每一个对象都有一个锁,sleep不会释放锁
线程休眠的作用
模拟网络延时:放大问题的发生性
package testthread;
//sleep模拟网络延时:放大问题的发生性,模拟抢票的并发问题
public class TestSleep implements Runnable {
//票数
private Integer ticketNums = 10;
@Override
public void run() {
while (true) {
if (ticketNums <= 0) {
break;
}
//模拟延时
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "抢到了第" + ticketNums-- + "张票");
}
}
public static void main(String[] args) {
TestSleep testSleep = new TestSleep();
new Thread(testSleep, "小红").start();
new Thread(testSleep, "小明").start();
new Thread(testSleep, "黄牛").start();
/*
输出:
小明抢到了第10张票
黄牛抢到了第9张票
小红抢到了第10张票
黄牛抢到了第8张票
小红抢到了第8张票
小明抢到了第7张票
黄牛抢到了第6张票
小明抢到了第4张票
小红抢到了第5张票
小红抢到了第3张票
黄牛抢到了第3张票
小明抢到了第3张票
黄牛抢到了第2张票
小红抢到了第2张票
小明抢到了第2张票
小明抢到了第1张票
黄牛抢到了第1张票
小红抢到了第1张票
*/
}
}
模拟倒计时
有超经典的一个段子,就是说老板要输出一天后的当前时间,然后代码里用sleep方法线程休眠了整整24小时然后输出的。
package testthread;
//sleep模拟倒计时:
public class TestSleep2 {
public static void main(String[] args) throws InterruptedException {
int countDown = 10;
while (true) {
Thread.sleep(1000);
System.out.println(countDown--);
if (countDown <= 0) {
break;
}
}
}
}