`

生产者与消费者问题

阅读更多
  • wait()和notify()&notifyAll()必须工作在加锁(synchronized)的代码块中。
  • 抢占的锁和释放的锁要是同一对象的锁,否则抛出IllegalMonitorStateException。

线程状态间的转换

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Stack.java

package thread;

public class Stack {
	private Object[] objs;
	private int index = 0;
    
	public Stack() {
		this(3);
	}

	public Stack(int length) {
		this.objs = new Object[length];
	}

	public void push(Object obj) {
		synchronized (this) {
			while (index == this.objs.length) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < 100000; i++)	{};
			objs[index] = obj;
			index++;
			this.notifyAll();
		}
	}

	public Object pop() {
		synchronized (this) {
			while (index == 0) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			--index;
			for (int i = 0; i < 100000; i++)	{};
			Object value = this.objs[index];
			this.notifyAll();
			return value;
		}
	}
}

 

Producer.java

package thread;

import java.util.Random;

public class Producer extends Thread{
	private Stack stack;
	
	public Producer(Stack stack){
		this.stack = stack;
	}
	
	@Override
	public void run() {
		Random ran = new Random();
		for (int i = 0; i < 20; i++) {
			Object obj = ran.nextInt(200);
			stack.push(obj);
			System.out.println(obj+" 压入成功。" );
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

Customer.java

package thread;

public class Customer extends Thread{
	private Stack stack;

	public Customer(Stack stack) {
		this.stack = stack;
	}

	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			Object value = stack.pop();
			System.out.println(value+" 弹出成功。");
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

Test.java

package thread;

public class Test {
	public static void main(String[] args) {
		Stack stack = new Stack();
		for (int i = 0; i < 20; i++) {
			Producer p = new Producer(stack);
			p.setName("producerThread");
			p.start();
		}
		for (int i = 0; i < 20; i++) {
			Customer c = new Customer(stack);
			c.setName("customerThread");
			c.start();
		}
	}
}

 

  • 描述: 线程间状态的转换
  • 大小: 7.7 KB
分享到:
评论

相关推荐

    pv操作解决生产者与消费者问题

    此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...

    操作系统中生产者与消费者问题实例

    操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...

    进程同步实验——生产者与消费者问题算法实现

    在这个实验“进程同步实验——生产者与消费者问题算法实现”中,我们探讨了一个经典的并发问题:生产者-消费者问题。 生产者-消费者问题是多线程编程中的一种典型应用场景,模拟了实际生产流水线的过程。在这个问题...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++

    例如,在生产者与消费者问题中,有一个缓冲区作为共享资源,生产者将产品放入缓冲区,而消费者则从缓冲区取出产品。为了保证数据的一致性,必须确保在任何时候,缓冲区要么只允许一个生产者写入,要么只允许一个消费...

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    ### 进程同步与互斥:生产者与消费者问题 #### 一、基础知识与概念解析 **1.1 操作系统的基本概念** 操作系统(Operating System, OS)是计算机系统的核心软件,负责管理和协调计算机硬件资源及软件资源。它通过...

    生产者与消费者问题(操作系统)

    生产者与消费者问题(操作系统)

    生产者与消费者问题(C++)

    在生产者与消费者问题中,可以使用两个信号量分别控制生产者和消费者对缓冲区的操作。 - **互斥锁**:另一种常见的同步机制,用于确保同一时间只有一个进程能够访问临界资源。在本例中,可以使用互斥锁来防止生产者...

    C例子:生产者与消费者问题

    该程序是我写的博客“一起talk C栗子吧(第一百零六回:C语言实例--生产者与消费者问题二)”的配套程序,共享给大家使用

    模拟生产者与消费者问题

    “生产者---消费者”问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。它是许多相互合作进程的抽象,如输入进程与计算...

    大连理工大学软件学院操作系统实验 生产者与消费者问题代码答案

    大连理工大学软件学院操作系统实验 生产者与消费者问题代码 热乎出炉 复制粘贴即能运行 !

    生产者与消费者问题Linux实现

    操作系统概念第七版第七单元实验 生产者与消费者问题linux下pthread代码 注释:此为刚完成的代码 请下载者主动修改 谢谢---mayy

    操作系统实验-模拟生产者与消费者问题

    操作系统实验中的“生产者与消费者问题”是一个经典的多线程同步问题,源于计算机科学理论,主要探讨如何在并发环境中有效地管理共享资源。本实验通过使用C#编程语言来模拟这个问题,帮助学生理解线程同步、互斥访问...

    java生产者与消费者问题

    在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...

    生产者与消费者问题 操作系统课程设计

    ### 生产者与消费者问题详解 #### 一、生产者-消费者问题背景 生产者-消费者问题是计算机科学中一个非常经典的进程同步问题。它通常用来描述一组“生产者”线程向缓冲区添加数据,而另一组“消费者”线程从缓冲区...

Global site tag (gtag.js) - Google Analytics