java 线程休眠的作用_java 多线程系列基础篇(七)之线程休眠

本文详细介绍了Java中Thread.sleep()方法,包括其作用、示例和与wait()的区别。sleep()使得线程进入休眠状态而不释放锁,而wait()会释放同步锁。通过示例展示了即使在休眠期间,其他线程也无法抢占持有锁的线程的执行权。
摘要由CSDN通过智能技术生成

1. sleep()介绍

sleep() 定义在Thread.java中。

sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

2. sleep()示例

下面通过一个简单示例演示sleep()的用法。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 // SleepTest.java的源码

2 class ThreadA extends Thread{

3 public ThreadA(String name){

4 super(name);

5 }

6 public synchronized void run() {

7 try {

8 for(int i=0; i <10; i++){

9 System.out.printf("%s: %d\n", this.getName(), i);

10 // i能被4整除时,休眠100毫秒

11 if (i%4 == 0)

12 Thread.sleep(100);

13 }

14 } catch (InterruptedException e) {

15 e.printStackTrace();

16 }

17 }

18 }

19

20 public class SleepTest{

21 public static void main(String[] args){

22 ThreadA t1 = new ThreadA("t1");

23 t1.start();

24 }

25 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

运行结果:

48304ba5e6f9fe08f3fa1abda7d326ab.png

t1: 0

t1: 1

t1: 2

t1: 3

t1: 4

t1: 5

t1: 6

t1: 7

t1: 8

t1: 9

48304ba5e6f9fe08f3fa1abda7d326ab.png

结果说明:

程序比较简单,在主线程main中启动线程t1。t1启动之后,当t1中的计算i能被4整除时,t1会通过Thread.sleep(100)休眠100毫秒。

3. sleep() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。

但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。

下面通过示例演示sleep()是不会释放锁的。

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 // SleepLockTest.java的源码

2 public class SleepLockTest{

3

4 private static Object obj = new Object();

5

6 public static void main(String[] args){

7 ThreadA t1 = new ThreadA("t1");

8 ThreadA t2 = new ThreadA("t2");

9 t1.start();

10 t2.start();

11 }

12

13 static class ThreadA extends Thread{

14 public ThreadA(String name){

15 super(name);

16 }

17 public void run(){

18 // 获取obj对象的同步锁

19 synchronized (obj) {

20 try {

21 for(int i=0; i <10; i++){

22 System.out.printf("%s: %d\n", this.getName(), i);

23 // i能被4整除时,休眠100毫秒

24 if (i%4 == 0)

25 Thread.sleep(100);

26 }

27 } catch (InterruptedException e) {

28 e.printStackTrace();

29 }

30 }

31 }

32 }

33 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

运行结果:

48304ba5e6f9fe08f3fa1abda7d326ab.png

t1: 0

t1: 1

t1: 2

t1: 3

t1: 4

t1: 5

t1: 6

t1: 7

t1: 8

t1: 9

t2: 0

t2: 1

t2: 2

t2: 3

t2: 4

t2: 5

t2: 6

t2: 7

t2: 8

t2: 9

48304ba5e6f9fe08f3fa1abda7d326ab.png

结果说明:

主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.sleep(100);但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!

注意,若我们注释掉synchronized (obj)后再次执行该程序,t1和t2是可以相互切换的。下面是注释调synchronized(obj) 之后的源码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 // SleepLockTest.java的源码(注释掉synchronized(obj))

2 public class SleepLockTest{

3

4 private static Object obj = new Object();

5

6 public static void main(String[] args){

7 ThreadA t1 = new ThreadA("t1");

8 ThreadA t2 = new ThreadA("t2");

9 t1.start();

10 t2.start();

11 }

12

13 static class ThreadA extends Thread{

14 public ThreadA(String name){

15 super(name);

16 }

17 public void run(){

18 // 获取obj对象的同步锁

19 // synchronized (obj) {

20 try {

21 for(int i=0; i <10; i++){

22 System.out.printf("%s: %d\n", this.getName(), i);

23 // i能被4整除时,休眠100毫秒

24 if (i%4 == 0)

25 Thread.sleep(100);

26 }

27 } catch (InterruptedException e) {

28 e.printStackTrace();

29 }

30 // }

31 }

32 }

33 }

48304ba5e6f9fe08f3fa1abda7d326ab.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值