相信大家对生产者消费者这个问题应该了解的差不多,这里我只讲解代码实现
synchronized版本:
package com.wt.pc;
/*
线程之间的通信问题:就是生产者和消费者的问题!等待唤醒,通知唤醒
线程交替执行
*/
public class P {
public static void main(String[] args) {
Data data = new Data();
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 Data{//数字 资源类,是独立耦合的,
private int number = 0;
//+1,只要是并发编程的话一定要有锁
public synchronized void increment() throws InterruptedException {
while (number!=0){//使用while防止虚假唤醒,使用if可能被虚假唤醒
//等待
this.wait();
}
number++;
//通知其他线程我+1完毕了
System.out.println(Thread.currentThread().getName()+"=>"+number);
this.notifyAll();
}
//-1
public synchronized void decrement() throws InterruptedException {
while (number==0){
//等待
this.wait();
}
number--;
//通知其他线程,我-1完毕了
System.out.println(Thread.currentThread().getName()+"=>"+number);
this.notifyAll();
}
}
JUC版本:
package com.wt.pc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class A {
public static void main(String[] args) {
Data3 data3 = new Data3();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data3.printA();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data3.printB();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
data3.printC();
}
},"C").start();
}
}
class Data3{
//资源类
private Lock lock = new ReentrantLock();//来个锁
//指定多个线程监视器
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
private int number = 1;
public void printA(){
lock.lock();
try {
//业务 判断和执行以及通知
while (number!=1){
//等待
condition1.await();
}
System.out.println(Thread.currentThread().getName()+"AAAAA");
number = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
//业务 判断和执行以及通知
while (number!=2){
condition2.await();
}
System.out.println(Thread.currentThread().getName()+"BBBBBBBBB");
//唤醒
number=3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
while (number!=3){
condition3.await();
}
System.out.println(Thread.currentThread().getName()+"CCCCC");
number = 1;
condition1.signal();
//业务 判断和执行以及通知
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}