首页 > 代码库 > 回顾java多线程中sleep的使用问题

回顾java多线程中sleep的使用问题

第一是同学说的问题,主线程先跑完,新线程跑的问题,结果是新开的线程是可以和主线程PK的,本来就是很基本的问题了,感觉应该是电脑问题。

下面是测试代码:

 1 package test;
 2 /**
 3  * @author AsceticJ
 4  * @date 2017年4月20日 下午10:25:14
 5  * @version 1.0
 6  * @TODO 测试在主线程中开启新的线程之后,主线程和新的线程执行顺序,结果说明新的线程和主线程是可以PK的
 7  */
 8 public class Test implements Runnable
 9 {
10     public static void main(String[] args)
11     {
12         Test test = new Test();
13         Thread thread = new Thread(test); 
14         thread.start();    
15         for(int i=0; i<10; i++){
16             System.out.println(Thread.currentThread().getName()+"嘿嘿嘿"+i);
17         }
18     }
19     
20     @Override
21     public void run()
22     {
23         for(int i=0; i<10; i++){
24             System.out.println(Thread.currentThread().getName()+"哈哈哈"+i);
25         }
26     }
27 
28 }

测试截图:主线程和新的线程交替执行

技术分享

 

第二个是看sleep方法不释放锁的问题

测试代码:

 1 package test;
 2 /**
 3  * @author AsceticJ
 4  * @date 2017年4月20日 下午10:25:14
 5  * @version 1.0
 6  * @TODO 测试在在同步代码块中调用sleep()方法后,线程不会释放锁
 7  */
 8 public class Test1 implements Runnable
 9 {
10     private String lock = "lock";
11     private int count = 0;
12     public static void main(String[] args)
13     {
14         Test1 test = new Test1();
15         Thread thread = new Thread(test); 
16         Thread thread1 = new Thread(test); 
17         thread.start();
18         thread1.start();
19         
20         for(int i=0; i<10; i++){
21             System.out.println(Thread.currentThread().getName()+"-PK胜利-正在嘿嘿嘿!"+i);
22         }
23     }
24     
25     @Override
26     public void run()
27     {
28         System.out.println(Thread.currentThread().getName()+" PK胜利!");
29         while(count<10){
30             System.out.println(Thread.currentThread().getName()+" 开始抢锁!");
31             synchronized (lock)
32             {
33                 System.out.println(Thread.currentThread().getName()+" 抢锁胜利,正在嘿嘿嘿!"+(count++));
34                 try
35                 {
36                     Thread.sleep(1000);
37                 } catch (InterruptedException e)
38                 {
39                     e.printStackTrace();
40                 }
41                 System.out.println(Thread.currentThread().getName()+" 嘿嘿嘿结束,准备下一波!"+(count++));
42             }
43             
44         }
45     }
46 
47 }

测试截图:

技术分享

 

第三个是问为什么要在同步块中使用sleep,不用sleep的时候为什么是一个线程全部执行

测试代码,只是一个注释了sleep一个没注释

 1 package test;
 2 /**
 3  * @author AsceticJ
 4  * @date 2017年4月20日 下午10:25:14
 5  * @version 1.0
 6  * @TODO 测试在在同步代码块中调用sleep()
 7  */
 8 public class Test3 implements Runnable
 9 {
10     private String lock = "lock";
11     private int count = 0;
12     public static void main(String[] args)
13     {
14         Test3 test = new Test3();
15         Thread thread = new Thread(test); 
16         Thread thread1 = new Thread(test); 
17         Thread thread2 = new Thread(test); 
18         thread.start();
19         thread1.start();
20         thread2.start();
21         for(int i=0; i<10; i++){
22             System.out.println(Thread.currentThread().getName()+"-PK胜利-正在嘿嘿嘿!"+i);
23         }
24     }
25     
26     @Override
27     public void run()
28     {
29         System.out.println(Thread.currentThread().getName()+" PK胜利!");
30         while(count<10){
31             System.out.println(Thread.currentThread().getName()+" 开始抢锁!");
32             synchronized (lock)
33             {
34                 System.out.println(Thread.currentThread().getName()+" 抢锁胜利,正在嘿嘿嘿!"+(count++));
35 //                try
36 //                {
37 //                    Thread.sleep(1000);
38 //                } catch (InterruptedException e)
39 //                {
40 //                    e.printStackTrace();
41 //                }
42                 System.out.println(Thread.currentThread().getName()+" 嘿嘿嘿结束,准备下一波!"+(count++));
43             }
44             
45         }
46     }
47 
48 }

测试截图:

未sleep:

技术分享

sleep:

技术分享

 最后附一张线程启动顺序的示意图

技术分享

回顾java多线程中sleep的使用问题