package ztext.pc;
/**
* JavaTest
*
* @author : xgj
* @description : de
* @date : 2020-09-20 14:40
**/
public class TestOne {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(()->{
for (int i = 0 ; i < 60 ;i++){
try {
myData.AddNumber();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{
for (int i = 0 ; i < 60 ;i++){
try {
myData.RemoveNumber();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{
for (int i = 0 ; i < 60 ;i++){
try {
myData.AddNumber();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{
for (int i = 0 ; i < 60 ;i++){
try {
myData.RemoveNumber();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
// 生产者消费者设计关键: 判断等待-》处理-》通知消息
class MyData{
private int numbers = 0;
// +1
public synchronized void AddNumber() throws InterruptedException {
//判断等待
while (numbers != 0){
this.wait();
}
//处理
System.out.println(Thread.currentThread().getName() + "->" + numbers++);
//通知消息
this.notifyAll();
}
// -1
public synchronized void RemoveNumber() throws InterruptedException {
while (numbers == 0){
this.wait();
}
System.out.println(Thread.currentThread().getName() + "->" + numbers--);
this.notifyAll();
}
}
package ztext.pc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* JavaTest
*
* @author : xgj
* @description : de
* @date : 2020-09-20 14:40
**/
public class TestOne {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(()->{
for (int i = 0; i < 60; i++) {
myData.AddNumber();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 60; i++) {
myData.RemoveNumber();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 60 ; i++) {
myData.AddNumber();
}
},"C").start();
new Thread(()->{
for (int i = 0; i < 60; i++) {
myData.RemoveNumber();
}
},"D").start();
}
}
// 生产者消费者设计关键: 判断等待-》处理-》通知消息
class MyData {
private int numbers = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// +1
public void AddNumber() {
lock.lock();
try {
//判断等待
while (numbers != 0) {
condition.await();
}
//处理
System.out.println(Thread.currentThread().getName() + "->" + numbers++);
//通知消息
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// -1
public void RemoveNumber() {
lock.lock();
try {
//判断等待
while (numbers == 0) {
condition.await();
}
//处理
System.out.println(Thread.currentThread().getName() + "->" + numbers--);
//通知消息
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}