三个线程交替打印ABC(Condition实现精确通知)
生活随笔
收集整理的這篇文章主要介紹了
三个线程交替打印ABC(Condition实现精确通知)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
三個(gè)線程交替打印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();}} }生產(chǎn)者和消費(fèi)者問題:
(synchronize + wait + notifyAll)
//判斷等待,業(yè)務(wù),通知 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();}} }總結(jié)
以上是生活随笔為你收集整理的三个线程交替打印ABC(Condition实现精确通知)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现按名称、日期、大小对文件进行
- 下一篇: SpringMVC传递JSON数据的方法