public class Consumer extends Thread {
private Clerk clerk;
public Consumer() {
}
public Consumer(Clerk clerk) {
this.clerk = clerk;
}
@Override
public void run() {
System.out.println("开始消费");
while (true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.consumerproduct();
}
}
}
class Product extends Thread{
private Clerk clerk;
public Product(Clerk clerk) {
this.clerk = clerk;
}
public Product() {
}
@Override
public void run() {
System.out.println("开始生产");
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.productproduct();
}
}
}
class Clerk{
private int num=0;
public synchronized void consumerproduct() {
if (num>0){
num--;
System.out.println(Thread.currentThread().getName()+"消费了一个产品,剩余:"+num);
// 只要消费了一个就可以唤醒生产者
notify();
}
else
try {
wait();//只能写在同步代码块中
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void productproduct() {
if (num<20){
num++;
System.out.println(Thread.currentThread().getName()+"生产了一个产品,剩余:"+num);
// 只要生产了一个就可以唤醒消费者
notify();
}
else
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Test{
public static void main(String[] args) {
// 只建立了一个类对象所以线程对象锁是一个
Clerk clerk=new Clerk();
Consumer consumer=new Consumer(clerk);
Product product=new Product(clerk);
consumer.setName("消费者");
product.setName("生产者");
consumer.start();
product.start();
}
}
生产者消费者
最新推荐文章于 2024-04-24 00:06:45 发布
该博客展示了Java中实现消费者-生产者问题的一个例子。通过Clerk类作为共享资源,两个线程Product(生产者)和Consumer(消费者)进行同步操作,使用wait()和notify()方法进行线程间通信,确保资源的正确使用和避免死锁。
摘要由CSDN通过智能技术生成