Java线程通信——生产者消费者问题
分析:
1.属于多线程问题:生产者(可能多个)、消费者(可能多个);
2.共享数据:产品;
3.通过同步机制解决线程安全问题;
4.涉及线程的通信问题;
代码示例:
import java.util.Random;
import java.util.TreeMap;
/**
* @author zane
* @create 2023-01-06-13:30
* 线程通信应用
* 生产者消费者问题
* 分析:
* 1.多线程问题,生产者,消费者
* 2.共享数据产品
* 3.通过同步机制解决线程安全问题
* 4.涉及线程的通信问题
*/
public class ProductTest {
public static void main(String[] args) {
Product product = new Product();
Producer p1 = new Producer(product);
Consumer c1 = new Consumer(product);
Consumer c2 = new Consumer(product);
p1.setName("Producer");
c1.setName("Consumer1");
c2.setName("Consumer2");
p1.start();
c1.start();
c2.start();
}
}
class Product{
private int productCount = 0;
//生产产品
public synchronized void produceProducts(){
if (productCount < 20){
productCount += 10;
System.out.println(Thread.currentThread().getName() + " begin to produce 10 products, and have total " + productCount + " products.");
notify();
}else{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//消费产品
public synchronized void consumeProducts(){
Random rand = new Random();
int cont = rand.nextInt(5);
System.out.println("********"+cont);
if (productCount >= cont){
int tep = productCount;
productCount -= cont;
System.out.println(Thread.currentThread().getName() + " begin to consume " + cont + " products, and " + (tep - cont)+ " products left.");
notify();
} else if (productCount < cont && productCount >= 0) {
int tep = productCount;
productCount = 0;
System.out.println(Thread.currentThread().getName() + " begin to consume " + tep + " products, and 0 products left.");
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Producer extends Thread{
private Product product;
public Producer(Product product){
this.product = product;
}
@Override
public void run(){
System.out.println(getName() + " begin to produce products.");
while(true){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
product.produceProducts();
}
}
}
class Consumer extends Thread{
private Product product;
public Consumer(Product product){
this.product = product;
}
@Override
public void run(){
System.out.println(getName() + " begin to consume products.");
while (true){
try {
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
product.consumeProducts();
}
}
}