三个线程交替打印ABC(Condition实现精确通知)
生活随笔
收集整理的这篇文章主要介绍了
三个线程交替打印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 = 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();}} }总结
以上是生活随笔为你收集整理的三个线程交替打印ABC(Condition实现精确通知)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Java实现按名称、日期、大小对文件进行
- 下一篇: IDEA 的 LeetCode 刷题插件