您好,登錄后才能下訂單哦!
小編給大家分享一下leetcode多線程之如何解決交替打印FooBar問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們提供一個類: class FooBar { public void foo() { for (int i = 0; i < n; i++) { print("foo"); } } public void bar() { for (int i = 0; i < n; i++) { print("bar"); } } } 兩個不同的線程將會共用一個 FooBar 實例。其中一個線程將會調用 foo() 方法,另一個線程將會調用 bar() 方法。 請設計修改程序,以確保 "foobar" 被輸出 n 次。 來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/print-foobar-alternately 著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
class FooBar { private int n; ReentrantLock lock = new ReentrantLock(); Condition fooCnd = lock.newCondition(); Condition barCnd = lock.newCondition(); boolean foo = true; public FooBar(int n) { this.n = n; } public void foo(Runnable printFoo) throws InterruptedException { lock.lock(); try { for (int i = 0; i < n; i++) { if (!foo) { fooCnd.await(); } foo = false; // printFoo.run() outputs "foo". Do not change or remove this line. printFoo.run(); barCnd.signal(); } } finally { lock.unlock(); } } public void bar(Runnable printBar) throws InterruptedException { lock.lock(); try { for (int i = 0; i < n; i++) { if (foo) { barCnd.await(); } foo = true; // printBar.run() outputs "bar". Do not change or remove this line. printBar.run(); fooCnd.signal(); } } finally { lock.unlock(); } } }
這里使用ReentrantLock的condition來進行條件控制
以上是“leetcode多線程之如何解決交替打印FooBar問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。