回顾java多线程中sleep的使用问题
Posted Ascetic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回顾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的使用问题的主要内容,如果未能解决你的问题,请参考以下文章