11.线程间的通信:什么是锁池和等待池???线程间的通信有哪三个常用方法???

    技术2023-07-09  96

    11.线程间的通信:什么是锁池和等待池???线程间的通信有哪三个常用方法???

    学习:第7遍


    1.什么是锁池和等待池???线程间的通信有哪些常见相关方法???

    Java中任何一个对象都自带锁、锁池和等待池三个东西

    锁池: 当线程执行synchronized块时如果无法获取特定对象上的锁,此时会进入该对象的锁池 当锁被归还给该对象时,锁池中的多个线程会竞争获取该对象的锁 获取对象锁的线程将执行synchronized块,执行完毕后会释放锁

    等待池: 当线程获取对象的锁后,可以调用 wait() 方法放弃锁,此时会进入该对象的等待池 当其他线程调用该对象的 notify() 或 notifyAll() 方法时,等待池中的线程会被唤醒,会进入该对 象的锁池 当线程获取对象的锁后,将从它上次调用wait()方法的位置开始继续运行


    2.线程间的通信有哪三个常用方法???

    方法一:thread.wait(2000) //可以设置等待的超时时间 作用:使线程放弃对象锁,线程进入等待池 可以调用等待超时时间,超时后线程会自动唤醒

    方法二:thread.notify() 作用:随机唤醒等待池中的一个线程,线程进入锁池 唤醒的是特定对象的等待池中的线程

    方法三:thread.notifyAll() 作用:唤醒等待池中的所有线程

    注意: 这三个方法都只能在synchronized块中使用,即只有获取了锁的线程才能调用 等待和唤醒必须使用的是同一个对象


    public class Test{ public static void main(String[] args) { Object obj = new Object(); //在WaitThread线程中将obj对象,通过obj.wait()进入等待池 WaitThread w = new WaitThread(obj); w.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // w.interrupt(); 可以打断调用wait()方法处于等待状态的WaitThread //在NotifyThread线程中将obj对象,通过obj.notifyAll()唤醒,进入锁池,获得锁运行 NotifyThread n = new NotifyThread(obj); n.start(); } } class WaitThread extends Thread { private Object obj; public WaitThread(Object obj){ this.obj=obj; } @Override public void run() { System.out.println(111); synchronized (obj) { try { System.out.println(getName() + "释放锁,即将进入等待池。。。。"); // this.wait(2000); //可以设置等待的超时时间 obj.wait(); } catch (InterruptedException e) { System.out.println(getName()+"被中断。。。。"); } } System.out.println(222); } } class NotifyThread extends Thread{ private Object obj; public NotifyThread(Object obj){ this.obj=obj; } @Override public void run() { synchronized (obj) { obj.notifyAll(); System.out.println(getName()+"已唤醒等待池中的线程。。。。。"); } } }
    Processed: 0.010, SQL: 9