signalAll() 和signal() 区别java
signalAll() 会唤醒全部的正在等待的线程ide
可是signal是公平的,只会唤起那个等待时间最长的线程spa
package com.yxl.task;
import lombok.SneakyThrows;import org.omg.PortableInterceptor.INACTIVE;
import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.concurrent.*;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;
/** * Condition 演示demo */public class ConditionDemo {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
//方法1 void method1(){ lock.lock(); try { System.out.println("条件不知足,开始await"); condition.await(); System.out.println("条件知足了,开始执行后续");
} catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }
//方法2 void method2() { lock.lock(); try { System.out.println("准备工做完成,唤醒其余线程 "); condition.signal(); } finally { lock.unlock(); } }
public static void main(String[] args) { ConditionDemo conditionDemo =new ConditionDemo(); new Thread(new Runnable() { @SneakyThrows @Override public void run() { Thread.sleep(1000); conditionDemo.method2(); } }).start(); conditionDemo.method1(); }}
执行结果:线程
条件不知足,开始await 准备工做完成,唤醒其余线程 条件知足了,开始执行后续3d
package com.yxl.task;
import lombok.SneakyThrows;import org.omg.PortableInterceptor.INACTIVE;import org.omg.PortableServer.THREAD_POLICY_ID;
import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.PriorityQueue;import java.util.concurrent.*;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;
/** * Condition 实现生产者 消费者 */public class ConditionDemo {
private int queueSize = 10 ; //队列 private PriorityQueue queue =new PriorityQueue(queueSize); //lock锁 private ReentrantLock lock = new ReentrantLock();
private Condition notFull = lock.newCondition(); private Condition notEmpty = lock.newCondition();
//方法1 class Consumer extends Thread { @SneakyThrows @Override public void run() { comsume(); } private void comsume() throws InterruptedException { while (true){ lock.lock(); try { while (queue.size() == 0) { System.out.println("队列空,等待数据"); notEmpty.await(); } queue.poll(); notFull.signalAll(); System.out.println("从队列里驱走了一个数据,剩下"+ queue.size()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
}
} }
class Produce extends Thread { @SneakyThrows @Override public void run() { produce(); } private void produce() throws InterruptedException { while (true){ lock.lock(); try { while (queue.size() == queueSize) { System.out.println("队列满,等待空闲"); notFull.await(); } queue.offer(1); notEmpty.signalAll(); System.out.println("向队列插入一个元素"+ queue.size()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
}
} }
public static void main(String[] args) { ConditionDemo conditionDemo =new ConditionDemo(); Produce produce = conditionDemo.new Produce(); Consumer consumer = conditionDemo.new Consumer(); consumer.start(); produce.start(); }}
#有兴趣的同窗能够看下源码实现 和 JDK 介绍code