java线程的一点感悟(sleep,wait,synchronized,时间片等)
志在以实例的方式描述线程中使用的一些容易混淆概念的方法。
1、sleep()方法不释放锁
public class SleepFunction { static final Object obj = new Object(); public static void main(String[] args) { new Thread(new Runnable() { public void run() { synchronized (obj) { System.out.println("new thread join"); obj.notify(); System.out.println("new thread end"); } } }).start(); while (true) { synchronized (obj) { System.out.println("begin"); try { Thread.sleep(3000); //sleep 不释放锁 //obj.wait(); //释放锁 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one loop end"); } } } }
输出结果:
begin one loop end begin one loop end begin one loop end begin one loop end begin one loop end begin one loop end .....
主线程将一直打印下去,永远结束不了,而子线程没有机会执行
2、wait()方法释放锁
public class SleepFunction { static final Object obj = new Object(); public static void main(String[] args) { new Thread(new Runnable() { public void run() { synchronized (obj) { System.out.println("new thread join"); obj.notify(); System.out.println("new thread end"); } } }).start(); while (true) { synchronized (obj) { System.out.println("begin"); try { //Thread.sleep(3000); //sleep 不释放锁 obj.wait(); //释放锁 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("one loop end"); } } } }
输出结果:
begin new thread join new thread end one loop end begin
主线程释放锁,子线程执行结束以后,主线程永远阻塞
3、不知道大家有没有一个混淆的地方,就是调用锁obj.wait()阻塞当前线程,被notify()函数唤醒以后,是从obj.wait()函数继续往下执行呢还是从while()循环继续判断开始呢
上面2例也验证了这个结果,是从obj.wait()接着往下执行,而不需要再一次从循环开始
4、
上一篇:
Java基础知识总结(2021版)