//自己的栈
class MyStack{
int[] max = null;
int index = 0;
public MyStack(int m){
max = new int[m];
}
public synchronized void push(int param){
//必须用while,被叫醒后,再检查一次
while(index>=max.length){
try {
System.out.println("栈已满 生产者WAIT===========================");
this.wait();
System.out.println("生产者 被notify");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
max[index] = param;
index ++ ;
}
public synchronized int pop(){
//必须用while,被叫醒后,再检查一次
while(index<=0){
try {
System.out.println("栈已空 消费者WAIT===========================");
this.wait();
System.out.println("消费者 被notify");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
index --;
return max[index];
}
}
//生产者
class Producer implements Runnable{
MyStack myStack = null;
int count;
public Producer(MyStack ms,int count){
myStack = ms;
this.count = count;
}
public void run(){
for(int i=1;i<=myStack.max.length;i++){
myStack.push(i);
System.out.println("第"+count+"个生产者,第"+i+"次生产:"+i);
try {
Thread.sleep((int)(Math.random()*300));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//消费者
class Consumer implements Runnable{
MyStack myStack = null;
int count;
int i;
public Consumer(MyStack ms,int count){
myStack = ms;
this.count = count;
}
public void run(){
for(int i=1;i<=myStack.max.length;i++){
int x = myStack.pop();
System.out.println("第"+count+"个消费者,第"+i+"次消费:"+x);
try {
Thread.sleep((int)(Math.random()*300));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//测试类
public class ProducerConsumerTest {
public static void main(String[] args) {
MyStack ms = new MyStack(10);
Thread p1 = new Thread(new Producer(ms,1));
Thread p2 = new Thread(new Producer(ms,2));
Thread p3 = new Thread(new Producer(ms,3));
Thread c1 = new Thread(new Consumer(ms,1));
Thread c2 = new Thread(new Consumer(ms,2));
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
}
}
分享到:
相关推荐
Linux线程编程中的生产者消费者问题是多线程编程中一个经典的同步问题,它涉及到线程间的协作和资源的共享。生产者线程负责生成数据并放入队列,而消费者线程则从队列中取出数据进行处理。在这个过程中,如何保证...
Java 技能鉴定试题涉及到的核心知识点包括生产者-消费者模式、XML文件解析、Java集合框架的使用、多线程编程以及数据排序。下面将详细解释这些知识点: 1. **生产者-消费者模式**:这是一种多线程设计模式,用于...
生产者消费者问题是一个经典的多线程编程应用场景。试题要求设计一个程序,模拟生产者和消费者之间的交互过程。在实际编程中,需要考虑线程同步机制,以防止数据竞争和不一致的问题。同时,异常处理也是多线程编程中...
在2014年百度的校园招聘中,技术类软件研发岗位的笔试题目主要考察了应聘者的Java虚拟机(JVM)理解、Servlet生命周期、volatile关键字的掌握以及生产者消费者模型的编程实现等核心知识点。下面将对这些关键点进行...
生产者-消费者模式是一种多线程同步问题的经典解决方案。在这个模式中,生产者负责创建资源,然后放入共享的缓冲区,而消费者则从缓冲区取出资源进行消费。在Java中,可以使用`java.util.concurrent`包下的`...
3. **生产者消费者问题**:最后一道应用题描述了经典的生产者消费者问题,通过信号量机制实现了线程间的同步和互斥,确保了数据的正确性和一致性。 综上所述,操作系统作为计算机科学的重要组成部分,其理论和实践...
例如,设计一个生产者消费者模型的程序。 七、泛型 泛型是Java 5引入的新特性,用于提供类型安全。考生需要理解泛型类、泛型方法和通配符的使用。例如,可能会设计一个泛型队列并实现其基本操作。 八、反射机制 ...
- 解决线程间通信问题通常涉及同步机制,如锁、信号量、生产者-消费者模式等。 - 可以使用互斥锁(mutex)、条件变量(condition variable)、队列(queue)等工具来确保线程安全的数据共享和通信。 - 此外,还可以利用...
3. **线程通信**:如生产者-消费者模型,线程间的信号传递(如Java的wait()、notify()和notifyAll()方法)。 4. **线程优先级**:了解线程调度算法和优先级对程序执行的影响。 5. **线程安全**:识别和解决线程不...
2. 生产者消费者问题:这是一个经典的多线程同步问题,描述了生产者进程生成数据,消费者进程消耗数据的场景。解决此问题通常采用缓冲区,限制生产者和消费者的并发访问。信号量可以用来管理缓冲区的满与空状态,...
* 生产者消费者问题:是一个经典的多进程同步问题,生产者产生数据,消费者消费数据,需要使用同步机制来避免僵死。 * 伪代码实现:可以使用信号量或互斥锁来实现生产者消费者问题的解决方案。 六、死锁避免和死锁...
在多线程编程中,参赛者需要实现生产者消费者模型,这涉及到Thread类、wait()、notify()等多线程同步方法以及并发控制。理解线程间的协作和同步机制对于编写高效、安全的多线程程序至关重要。 此外,概率计算是编程...
13. BlockingQueue:研究阻塞队列在并发编程中的应用,如生产者消费者模型的实现。 四、并发设计模式 14. 管道模式:理解如何使用PipedInputStream和PipedOutputStream实现线程间的通信。 15. 线程池设计:学习如何...
2. **生产者-消费者问题**:这是一个典型的多线程同步问题,通过信号量机制来实现生产者和消费者之间的同步,确保数据的一致性和完整性。 ### 三、死锁分析 1. **死锁的概念与条件**:死锁是指两个或两个以上的...
1. 现代操作系统采用的技术包括:微内核架构、虚拟化技术、多线程/多进程模型、分布式计算、网络协议栈、安全机制(如权限控制和访问控制列表)、内存管理优化(如分页和分段)以及用户友好的图形用户界面(GUI)等...
管道流是专门用于线程间通信的一种特殊流,它可以在生产者线程和消费者线程之间传输数据。 #### 题目26: JDK工具 - **知识点**: JDK中包含哪些工具? - **解析**: JDK包含了多种工具,包括: - Java编译器(javac...
4. 生产者-消费者问题是并发编程中经典的同步问题,生产者进程负责生成数据,消费者进程负责消费数据。通过信号量或条件变量等同步机制,可以实现生产者与消费者间的数据安全交换,避免数据竞争和死锁等问题。
10. 生产者-消费者问题:生产者-消费者问题是一个经典的同步问题,涉及多个进程或线程对共享资源的访问。通过使用P和V操作(也称作wait和signal操作),可以实现对共享资源的正确管理,确保生产者不会在消费者消费...
- 同步:多个进程按一定顺序执行,如生产者-消费者问题。 - 互斥:确保同一时刻只有一个进程访问临界资源,如信号量机制、管程、自旋锁等。 4. **内存管理** - 分页和分段:内存的逻辑地址与物理地址映射,解决...