concurrent(四)Condition
生活随笔
收集整理的這篇文章主要介紹了
concurrent(四)Condition
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考文檔:
Java多線程系列--“JUC鎖”06之 Condition條件:http://www.cnblogs.com/skywang12345/p/3496716.html
Condition介紹
Condition的作用是對鎖進行更精確的控制。Condition中的await()方法相當于Object的wait()方法,Condition中的signal()方法相當于Object的notify()方法,Condition中的signalAll()相當于Object的notifyAll()方法。不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步鎖"(synchronized關鍵字)捆綁使用的;而Condition是需要與"互斥鎖"/"共享鎖"捆綁使用的?;赨nsafe.park()/Unsafe.unpark()實現
Condition函數列表
// 造成當前線程在接到信號或被中斷之前一直處于等待狀態。 void await() // 造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態。 boolean await(long time, TimeUnit unit) // 造成當前線程在接到信號、被中斷或到達指定等待時間之前一直處于等待狀態。 long awaitNanos(long nanosTimeout) // 造成當前線程在接到信號之前一直處于等待狀態。 void awaitUninterruptibly() // 造成當前線程在接到信號、被中斷或到達指定最后期限之前一直處于等待狀態。 boolean awaitUntil(Date deadline) // 喚醒一個等待線程。 void signal() // 喚醒所有等待線程。 void signalAll()舉個栗子-單條件
public class ConditionTest {private static Lock lock = new ReentrantLock();private static Condition condition = lock.newCondition();public static void main(String[] args) {ThreadA ta = new ThreadA("t");lock.lock(); // 獲取鎖try {System.out.println(Thread.currentThread().getName() + " start ta");ta.start();System.out.println(Thread.currentThread().getName() + " block");condition.await(); // 等待System.out.println(Thread.currentThread().getName() + " continue");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock(); // 釋放鎖 }}static class ThreadA extends Thread {public ThreadA(String name) {super(name);}public void run() {lock.lock(); // 獲取鎖try {try {Thread.sleep(1000*5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " wakup others");condition.signal(); // 喚醒“condition所在鎖上的其它線程”} finally {lock.unlock(); // 釋放鎖 }}} } View Code舉個栗子-多條件
/*** 生產者消費者模型。一個lock,兩個condition,一個condition控制消費者,一個condition控制生產者* @author BFD_526**/ public class ConditionMoreTest {private static BoundedBuffer bb = new BoundedBuffer();public static void main(String[] args) {new PutThread("producer").start();new TakeThread("consumer").start();}static class PutThread extends Thread {public PutThread(String name) {super(name);}public void run() {while (true) {try {// 向BoundedBuffer中寫入數據Random rd = new Random();bb.put(rd.nextInt(100));Thread.sleep(1000*2);} catch (InterruptedException e) {e.printStackTrace();}}}}static class TakeThread extends Thread {public TakeThread(String name) {super(name);}public void run() {while (true) {try {// 從BoundedBuffer中取出數據Integer num = (Integer) bb.take();//Thread.sleep(1000 * 3);} catch (InterruptedException e) {e.printStackTrace();}}}} }class BoundedBuffer {final Lock lock = new ReentrantLock();final Condition notFull = lock.newCondition();final Condition notEmpty = lock.newCondition();List<Integer> store = new ArrayList<Integer>();int limitSize=5;public void put(Integer x) throws InterruptedException {lock.lock(); // 獲取鎖System.out.println("put start size:"+store.size());try {// 如果“緩沖已滿”,則等待;直到“緩沖”不是滿的,才將x添加到緩沖中。while (store.size() == limitSize) {System.out.println("buffer full wait " + Thread.currentThread().getName());notFull.await();} // 將x添加到緩沖中 store.add(x);// 喚醒take線程,因為take線程通過notEmpty.await()等待 notEmpty.signal();System.out.println(Thread.currentThread().getName() + " put " + (Integer) x);} finally {lock.unlock(); // 釋放鎖 }}public Object take() throws InterruptedException {lock.lock(); // 獲取鎖System.out.println("take start size:"+store.size());try {// 如果“緩沖為空”,則等待;直到“緩沖”不為空,才將x從緩沖中取出。while (store.size() == 0)notEmpty.await();// 將x從緩沖中取出Object x = store.remove(0);// 喚醒put線程,因為put線程通過notFull.await()等待 notFull.signal();// 打印取出的數據System.out.println(Thread.currentThread().getName() + " take " + (Integer) x);return x;} finally {lock.unlock(); // 釋放鎖 }} } View Code?
轉載于:https://www.cnblogs.com/amei0/p/9021823.html
總結
以上是生活随笔為你收集整理的concurrent(四)Condition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: extjs5(05--主界面上加入顶部和
- 下一篇: 分布式锁 基于Redis