Java synchronized方式的生成者和消费者同步

本文介绍了一个使用Java实现的简单同步生产者-消费者模型。该模型通过`EventStorage`类存储和管理资源,确保生产者线程和消费者线程能够正确地进行资源存取操作。在`MainTest`类中,通过创建100个生产者线程和100个消费者线程,演示了生产者-消费者模型的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EventStorage : 资源类,用来存储共同资源

package thread.sync.two;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class EventStorage {
	private int maxSize;  
    private List<Date> storage;  
      
    public EventStorage(){  
        maxSize = 50;  
        storage = new LinkedList<Date>();  
    }  
      
    public synchronized void set(String threadName){  
        while(storage.size() == maxSize){
        	System.out.println("---------------------------set等待中--------------------");
            try {  
                wait();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
        Date date = new Date();
        ((LinkedList<Date>) storage).offer(date);  
        System.out.println("+++++ "+threadName+ " : "+storage.size() +"   Date:"+ date.toString());  
        notifyAll();  
    }  
      
    public synchronized void get(String threadName){  
        while(storage.size()==0){  
            System.out.println("---------------------------get等待中--------------------");  
            try {  
                wait();  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        } 
        Date date = ((LinkedList<Date>) storage).poll();
        System.out.println("---- "+threadName+ " : "+storage.size() +"   Date:" + date.toString());  
        notifyAll();  
    }  
}

MainTest : 此方法把生产者类(Producer)和消费者类(Consumer)都写成了内部静态类,没有在各自的生产和消费的run方法中循环,而是在main方法中模拟了多个生成者和消费者进行操作,比通用的在run方法里进行循环来得更形象

package thread.sync.two;

public class MainTest {

	public static void main(String[] args) {
		EventStorage storage = new EventStorage();
		Consumer consumer = new MainTest.Consumer(storage);
		Producer producer = new MainTest.Producer(storage);
		Thread t = null;
		for(int i=0;i<100;i++){
			t = new Thread(producer," pro"+i);
			t.start();
		}
		for(int i=0;i<100;i++){
			t = new Thread(consumer," con"+i);
			t.start();
		}
	}
	
	
	static class Producer implements Runnable {

		private EventStorage storage;  
	    public Producer(EventStorage storage){  
	        this.storage = storage;  
	    }  
		
		@Override
		public void run() {
			storage.set(Thread.currentThread().getName());
		}

	}
	
	static class Consumer implements Runnable {

		private EventStorage storage;

		public Consumer(EventStorage storage) {
			this.storage = storage;
		}

		@Override
		public void run() {
			storage.get(Thread.currentThread().getName());
		}

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值