码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-04-21 09:55:44      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:string   private   执行顺序   启动顺序   start   同步代码块   trace   override   auth   

第一是同学说的问题,主线程先跑完,新线程跑的问题,结果是新开的线程是可以和主线程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的使用问题

标签:string   private   执行顺序   启动顺序   start   同步代码块   trace   override   auth   

原文地址:http://www.cnblogs.com/ascetic-xj/p/6741621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!