-
传统的线程通信
-
三种方法wait( ) notify( ) notifyAll( )
-
synchronized修饰的同步方法,对象是(this),所以可以在同步方法中调用这三种方法
-
synchronized修饰的同步代码块,只能通过该对象来调用这三种方法
-
wait( ):使线程等待,直到调用notify( ) notifyAll( );
-
notify( ):唤醒此同步监视器上等待的单个线程;
-
notifyAll( ):唤醒此同步监视器上等待的所以线程;
-
-
-
使用Condition控制线程通信
-
使用Lock对象来保证同步,使用Condition可以让已经获得Lock对象却无法继续执行的线程释放Lock对象。
-
Condition类提供三种方法:
-
await( ):导致当前线程等待;
-
signal( ):唤醒在此Lock对象上等待的单个线程
-
signalAll( ):唤醒在此Lock对象上等待的所有线程
-
代码块
// 显式定义Lock对象 private final Lock lock = new ReentrantLock(); // 获得指定Lock对象对应的Condition private final Condition cond = lock.newCondition(); .................. if (!flag) { cond.await(); } else { // 执行取钱 System.out.println(Thread.currentThread().getName() + " 取钱:" + drawAmount); balance -= drawAmount; System.out.println("账户余额为:" + balance); // 将标识账户是否已有存款的旗标设为false。 flag = false; // 唤醒其他线程 cond.signalAll(); } }
-
-
-
使用阻塞队列(BlockingQuene)控制线程通信:
-
当生产者线程试图向BlockingQuene中放入元素时,如果该队列已满,则线程被阻塞; 当消费者线程试图从BlockingQuene中取出元素时,如果队列已空,则该线程被阻塞
-
BlockingQuene提供两个阻塞方法
-
put(E e):把E元素放入BlockingQuene中,若队列的元素已满,则线程阻塞
-
take( ):从BlockingQuene头部取出元素,若队列的元素已空,则线程阻塞
-
BlockingQuene继承了Quene接口,可以使用Quene接口中的方法。
-
在队列尾部插入元素。包括add(E e) offer(E e)和put(E e)方法
-
在队列头部删除并返回删除的元素。包括remove( ),poll( )和take( )方法
-
在队列头部取出但不删除元素。包括element( )和peek( )方法
-
//创建一个长度为2的阻塞队列
BlockingQuene<String> bq = new ArrayBlockingQuene<>(2); bq.put("java"); bq.put("java"); bq.put("java"); //阻塞线程
-
-
-
多线程之线程通信
于 2022-03-17 23:06:48 首次发布