三个线程交替打印ABC(Condition实现精确通知)

三个线程交替打印ABC:

package pc; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class C { public static void main(String[] args) { Data3 data3 = new Data3(); new Thread(()->{ for (int i = 0; i < 50; i++) { data3.PrintA(); } }).start(); new Thread(()->{ for (int i = 0; i < 50; i++) { data3.PrintB(); } }).start(); new Thread(()->{ for (int i = 0; i < 50; i++) { data3.PrintC(); } }).start(); } } class Data3{ private char chars = 'A'; Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); public void PrintA(){ lock.lock(); try { while (chars != 'A') { //等待 condition1.await(); } System.out.print(chars); chars = 'B'; condition2.signal(); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } }public void PrintB(){ lock.lock(); try { while (chars != 'B') { condition2.await(); } System.out.print(chars); chars = 'C'; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void PrintC() { lock.lock(); try { while (chars != 'C') { condition3.await(); } System.out.print(chars); chars = 'A'; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }

生产者和消费者问题: (synchronize + wait + notifyAll)
//判断等待,业务,通知 class Data { private int number = 0; public synchronized void increment() throws InterruptedException { while (number != 0) { //等待 this.wait(); } number++; System.out.println(Thread.currentThread().getName() + "=>" + number); //通知其他线程,我+1完毕了 this.notifyAll(); }public synchronized void decrement() throws InterruptedException { while (number == 0) { this.wait(); } number--; System.out.println(Thread.currentThread().getName() + "=>" + number); //通知其他线程,我-1完毕了 this.notifyAll(); } }

(ReentrantLock+Condition)
package pc; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class B { public static void main(String[] args) { Data2 data = https://www.it610.com/article/new Data2(); new Thread(() -> { for (int i = 0; i < 10; i++) { try { data.increment(); } catch (InterruptedException e) { e.printStackTrace(); } } }, "A").start(); new Thread(() -> { for (int i = 0; i < 10; i++) { try { data.decrement(); } catch (InterruptedException e) { e.printStackTrace(); } } }, "B").start(); } }class Data2 { private int number = 0; Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void increment() throws InterruptedException { lock.lock(); try { while (number != 0) { //等待 condition.await(); } number++; System.out.println(Thread.currentThread().getName() + "=>" + number); //通知其他线程,我+1完毕了 condition.signalAll(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }public void decrement() throws InterruptedException { lock.lock(); try { while (number == 0) { condition.await(); } number--; System.out.println(Thread.currentThread().getName() + "=>" + number); //通知其他线程,我-1完毕了 condition.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }

    推荐阅读