欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/3/21 编程问答 67 豆豆
生活随笔 收集整理的这篇文章主要介绍了 三个线程交替打印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实现精确通知)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。