0%

线程休眠

线程休眠

  • sleep( 时间 ) 指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException
  • sleep时间到达后,线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等等
  • 每一个对象都有一个锁,sleep不会释放锁

线程休眠可以应用在许多地方,例如:模拟网络延迟、模拟倒计时、

代码演示

模拟网络延迟

线程休眠可以放大问题的发生性。

例如下边的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class TestThread4 implements Runnable{
private int ticketNums = 10;//票数
@Override
public void run() {
while (true){
if (ticketNums <= 0){
break;
}
//Thread.currentThread().getName()方法获取线程名字
System.out.println(Thread.currentThread().getName()+"----拿到了第"+ticketNums--+"张票~");
}
}

public static void main(String[] args) {
TestThread4 ticker = new TestThread4();

new Thread(ticker,"小明").start();
new Thread(ticker,"Pete").start();
new Thread(ticker,"钢铁侠").start();
}
}

不使用线程休眠那么运行结果如下。好像挺正常的。

1
2
3
4
5
6
7
8
9
10
11
12
小明----拿到了第10张票~
小明----拿到了第9张票~
小明----拿到了第8张票~
小明----拿到了第7张票~
小明----拿到了第6张票~
小明----拿到了第5张票~
小明----拿到了第4张票~
小明----拿到了第3张票~
小明----拿到了第2张票~
小明----拿到了第1张票~

Process finished with exit code 0

在TestThread4的run方法中添加线程休眠,模拟延时。添加代码如下:

1
Thread.sleep(200);//模拟延时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class TestThread4 implements Runnable{
private int ticketNums = 10;//票数
@Override
public void run() {
while (true){
if (ticketNums <= 0){
break;
}
try {
Thread.sleep(200);//模拟延时
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread().getName()方法获取线程名字
System.out.println(Thread.currentThread().getName()+"----拿到了第"+ticketNums--+"张票~");
}
}

public static void main(String[] args) {
TestThread4 ticker = new TestThread4();

new Thread(ticker,"小明").start();
new Thread(ticker,"Pete").start();
new Thread(ticker,"钢铁侠").start();
}
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Pete----拿到了第9张票~
小明----拿到了第8张票~
钢铁侠----拿到了第10张票~
Pete----拿到了第6张票~
钢铁侠----拿到了第5张票~
小明----拿到了第7张票~
Pete----拿到了第4张票~
钢铁侠----拿到了第2张票~
小明----拿到了第3张票~
Pete----拿到了第1张票~
钢铁侠----拿到了第1张票~
小明----拿到了第0张票~

Process finished with exit code 0

发现问题:多个线程操作一个资源时,会导致线程不安全,数据紊乱。

模拟倒计时

使用Thread.sleep(1000);让线程休眠一秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//线程休眠,模拟倒计时
public class TestSleep {
public static void tenDown(){
int num = 10;
while(true){
System.out.println(num--);//打印数字,之后减一
try {
Thread.sleep(1000);//线程休眠一秒
} catch (InterruptedException e) {
e.printStackTrace();
}
if(num <= 0){
break;
}
}
}

public static void main(String[] args) {
tenDown();
}
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
10
9
8
7
6
5
4
3
2
1

Process finished with exit code 0

打印时间

使用Thread.sleep(1000);让线程休眠一秒。每秒钟打印一次系统时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestSleep {
// 打印系统时间
public static void printDate(){
Date nowTime = new Date(System.currentTimeMillis());//获取系统当前时间
while (true){
System.out.println(new SimpleDateFormat("HH:mm:ss").format(nowTime));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
nowTime = new Date(System.currentTimeMillis());//更新时间
}
}

public static void main(String[] args) {
printDate();
}
}

运行结果:

1
2
3
4
5
...
16:00:48
16:00:49
16:00:50
...
若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道