并发编程:线程同步基础:3.2、使用两个线程模拟生产者和消费者执行任务。

发布时间:2024年01月03日

目录

主要方法

1、主程序

?2、生产者

3、消费者

4、中间队列(主要代码)

5、执行结果


主要方法

  1. wait();? 线程等待
  2. notify(); 通知一个等待的线程
  3. notifyAll(); 通知所有等待的线程

1、主程序

package xyz.jangle.thread.test.n2_3.synccondition;
/**
 * 
 * 	使用两个线程模拟生产者和消费者执行任务。
 * 	1、生产者将队列填充满之后会通知消费者进行消费。(应该是等待消费者进行消费)
 *  2、消费者将队列消费为空之后,会通知生产者生产。(应该是等待生产者进行生产2024年1月3日10:10:16)
 *  
 *  此处共同使用了EventStorage的对象锁,也就是synchronized方法锁,使用notify()方法进行通知。
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年7月16日 下午10:19:19
 * 
 */
public class M {

	public static void main(String[] args) {

		EventStorage e = new EventStorage();
		Producer p = new Producer(e);	// 生产者线程
		Consumer c = new Consumer(e);	// 消费者线程
		new Thread(p).start();
		new Thread(c).start();
		
	}

}

?2、生产者

package xyz.jangle.thread.test.n2_3.synccondition;
/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年7月16日 下午10:16:21
 * 
 */
public class Producer implements Runnable {
	
	private EventStorage storage;
	
	

	public Producer(EventStorage storage) {
		super();
		this.storage = storage;
	}



	@Override
	public void run() {
		
		for(int i=0;i<100;i++) {
			storage.set();
		}

	}

}

3、消费者

package xyz.jangle.thread.test.n2_3.synccondition;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年7月16日 下午10:18:00
 * 
 */
public class Consumer implements Runnable {

	private EventStorage storage;

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

	@Override
	public void run() {

		for (int i = 0; i < 100; i++)
			storage.get();

	}

}

4、中间队列(主要代码)

此处共同使用了EventStorage的对象锁,也就是synchronized方法锁,使用notify()方法进行通知。

package xyz.jangle.thread.test.n2_3.synccondition;

import java.util.Date;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年7月16日 下午10:04:56
 * 
 */
public class EventStorage {

	private int maxSize;

	private Queue<Date> storage;

	public EventStorage() {
		maxSize = 10;
		storage = new LinkedList<Date>();
	}
	
	
	public synchronized void set() {
		while(storage.size() == maxSize) {
			try {
				System.out.println("生产满");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		storage.offer(new Date());
		System.out.printf("Set: %d",storage.size());
		notify();
	}
	
	public synchronized void get() {
		while(storage.size() == 0) {
			try {
				System.out.println("消费完");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		String string = storage.poll().toString();
		System.out.printf("Get: %d:%s \n",storage.size(),string);
		notify();
	}
	
	

}

5、执行结果

Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
Set: 1Set: 2Set: 3Set: 4Set: 5Set: 6Set: 7Set: 8Set: 9Set: 10生产满
Get: 9:Wed Jan 03 14:37:43 CST 2024 
Get: 8:Wed Jan 03 14:37:43 CST 2024 
Get: 7:Wed Jan 03 14:37:43 CST 2024 
Get: 6:Wed Jan 03 14:37:43 CST 2024 
Get: 5:Wed Jan 03 14:37:43 CST 2024 
Get: 4:Wed Jan 03 14:37:43 CST 2024 
Get: 3:Wed Jan 03 14:37:43 CST 2024 
Get: 2:Wed Jan 03 14:37:43 CST 2024 
Get: 1:Wed Jan 03 14:37:43 CST 2024 
Get: 0:Wed Jan 03 14:37:43 CST 2024 
消费完
...
...
...

文章来源:https://blog.csdn.net/Bof_jangle/article/details/135363027
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。