您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java怎么使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java怎么使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程”吧!
Condition是一個(gè)接口,創(chuàng)建Condition的實(shí)例不能直接new,Java為我們提供一個(gè)通過Lock類實(shí)例來調(diào)用newCondition()的方法來創(chuàng)建。Condition因素出Object監(jiān)視器方法( wait , notify和notifyAll )到不同的對(duì)象,以得到具有多個(gè)等待集的每個(gè)對(duì)象,通過將它們與使用任意的組合的效果Lock個(gè)實(shí)現(xiàn)。 如果Lock替換了synchronized方法和語句的使用,則Condition將替換Object監(jiān)視方法的使用。
條件(也稱為條件隊(duì)列或條件變量 )為一個(gè)線程提供暫停執(zhí)行(“等待”)的手段,直到另一個(gè)線程通知某個(gè)狀態(tài)條件現(xiàn)在可能為真。 由于對(duì)此共享狀態(tài)信息的訪問發(fā)生在不同的線程中,因此必須對(duì)其進(jìn)行保護(hù),因此某種形式的鎖定與該條件相關(guān)聯(lián)。 等待條件提供的關(guān)鍵屬性是它以原子方式釋放關(guān)聯(lián)的鎖并掛起當(dāng)前線程,就像Object.wait一樣。
例子1
package testJUC; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestCondition { public static void main(String[] args) { Product3 product = new Product3(); new Thread(()->{ for (int i = 0; i < 5; i++) new Producer(product).getProduct(); },"工廠").start(); new Thread(()->{ for (int i = 0; i < 5; i++) new Consumer(product).saleProduct(); },"學(xué)生").start(); } } class Product3 { private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private int flag = 1;//標(biāo)識(shí)符 public void getProduct() { //加鎖 lock.lock(); try { //使用while循環(huán),可以有效避免線程虛假喚醒 while (flag != 1) { condition1.await(); } flag = 2; //喚醒saleProduct condition2.signal(); System.out.println(Thread.currentThread().getName() + "生產(chǎn)一個(gè)產(chǎn)品"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解鎖 lock.unlock(); } } public void saleProduct() { lock.lock(); try { while (flag != 2) { condition2.await(); } flag = 1; //喚醒getProduct condition1.signal(); System.out.println(Thread.currentThread().getName()+"消費(fèi)了一個(gè)產(chǎn)品"); }catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } } //實(shí)體類 class Producer{ private Product3 product = null; public Producer(Product3 product) { this.product = product; } public void getProduct(){ product.getProduct(); } } class Consumer{ private Product3 product = null; public Consumer(Product3 product) { this.product = product; } public void saleProduct(){ product.saleProduct(); } }
結(jié)果
例子2
package testJUC; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestCondition { public static void main(String[] args) { Print print = new Print(); new Thread(() -> { for (int i = 0; i < 5; i++) print.printA(); }).start(); new Thread(() -> { for (int i = 0; i < 5; i++) print.printB(); }).start(); new Thread(() -> { for (int i = 0; i < 5; i++) print.printC(); }).start(); } } class Print { private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); private int number = 1; //輸出A的方法 public void printA() { //加鎖 lock.lock(); try { //使用while循環(huán),可以有效避免線程虛假喚醒 while (number != 1) { condition1.await(); } number = 2; //喚醒輸出B的方法 condition2.signal(); System.out.println("AAA"); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解鎖 lock.unlock(); } } //輸出B的方法 public void printB() { //加鎖 lock.lock(); try { while (number != 2) { condition2.await(); } System.out.println("BBB"); number = 3; //喚醒C condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //喚醒輸出C的方法 lock.unlock(); } } //輸出C的方法 public void printC() { //加鎖 lock.lock(); try { while (number != 3) { condition3.await(); } System.out.println("CCC"); number = 1; //喚醒輸出A的方法 condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { //解鎖 lock.unlock(); } } }
結(jié)果2
感謝各位的閱讀,以上就是“Java怎么使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java怎么使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。