class SyncQueue...{
private int head=0;//队头
private int tail=1;//队尾
public final int Num=6;//缓冲区大小
public char data[]=new char[Num];
public synchronized void inqueue(char c)...{
while((tail+1)%Num==head)...{
try...{
this.wait();
}catch(InterruptedException e)...{System.out.println(e);}
}
this.notify();
data[tail]=c;
tail=(tail+1)%Num;
System.out.println("produced:" + c );
}
public synchronized char outqueue()...{
while((head+1)%Num==tail)...{
try...{
this.wait();
}catch(InterruptedException e)...{System.out.println(e);}
}
this.notify();
head=(head+1)%Num;
System.out.println("消费:"+data[head]);
return data[head];
}
}
class Producer implements Runnable...{
SyncQueue queue;
public Producer(SyncQueue s)...{
queue=s;
}
public void run()...{
for(int i=0;i<20;i++)...{
char c=(char)(Math.random()*26+'A');
queue.inqueue(c);
try...{
Thread.sleep((int)(Math.random()*20));
}catch(InterruptedException e)...{System.out.println(e);}
}
}
}
class Customer implements Runnable...{
SyncQueue queue;
public Customer(SyncQueue s)...{
queue=s;
}
public void run()...{
for(int i=0;i<20;i++)...{
char c=queue.outqueue();
try...{
Thread.sleep((int)(Math.random()*20));
}catch(InterruptedException e)...{System.out.println(e);}
}
}
}
public class SyncTest...{
public static void main (String[] args) ...{
SyncQueue queue=new SyncQueue();
Runnable p=new Producer(queue);
Runnable c=new Customer(queue);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
注:注意wait()和notify()的位置,否则将引者死锁的发生。
分享到:
相关推荐
本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...
总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...
在"阻塞队列实现生产者消费者模式Java开发Java经验技巧共4页.pdf.zip"这个压缩包中,很可能是详细介绍了如何使用Java的阻塞队列来构建生产者消费者模式,可能包括以下知识点: 1. **阻塞队列接口**:首先,会介绍`...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...
`BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...
下面是一个简单的生产者消费者问题的Java实现: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerProblem { public static void main(String[] args) { ...
在Java中,`java.util.concurrent`包下的`BlockingQueue`接口提供了一种线程安全的数据结构,非常适合用于实现生产者消费者模式。生产者将产品放入队列,消费者从队列中取出产品。`BlockingQueue`提供了`put()`和`...
总之,这个项目通过Java的多线程和`BlockingQueue`,实现了生产者消费者问题的直观演示,无论是在GUI界面还是命令行环境中都能运行。对于学习Java并发编程和理解线程同步机制的人来说,这是一个非常有价值的实践案例...
2. **阻塞队列**:在Java中,阻塞队列(如`ArrayBlockingQueue`)常用于生产者-消费者问题。当队列满时,生产者会被阻塞,直到队列有空位;当队列为空时,消费者会被阻塞,直到队列中有数据。这样可以避免资源浪费,...
在CSDN.NET博客文章中,作者详细讨论了如何使用线程同步和等待的应用来解决此问题,并提供了示例代码ProducerConsumer.java和ProducerConsumerx.java,这些代码可以帮助读者更好地理解和实现生产者消费者模型。...
在描述中提到的"生产者消费者java源码.txt"文件,可能包含了具体的实现细节。在这个文件中,我们可以预期找到`Producer`和`Consumer`类的定义,这两个类分别代表生产者和消费者。`Producer`类通常包含一个循环,用于...
在Java编程中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到了如何在多线程环境下有效地共享资源。在这个问题中,"生产者"负责创建资源,而"消费者"则负责消费这些资源。为了确保生产者不会在资源耗尽时...
Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...
综上所述,"消息分发框架(基于JAVA阻塞队列实现、生产者消费者模型)"是一个关键的并发处理组件,通过Java提供的并发工具和设计模式,实现了高效、稳定的消息处理。在实际应用中,需要根据业务需求进行适当的性能...
### 生产者消费者模型在Java中的实现 #### 概述 生产者消费者模型是一种经典的多线程编程模式,被广泛应用于解决并发环境下的数据生产和消费问题。在这个模型中,“生产者”负责创建数据并将其放入缓冲区(通常是...
在Java中实现生产者消费者模式,主要依赖于Java提供的并发工具类,如`BlockingQueue`接口以及其实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列具有线程安全的特性,能够有效地避免数据竞争和...
在Java中,阻塞队列(BlockingQueue)是一个很好的实现生产者/消费者模式的工具,而LinkedBlockingQueue则是Java并发包(java.util.concurrent)中提供的一个具体实现。 LinkedBlockingQueue是一个基于链表结构的...
Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。...队列是许多算法和并发编程场景的基础,如生产者消费者模型、多线程同步等,因此深入理解和掌握队列的实现至关重要。
在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程间的同步与通信。在这个模型中,生产者线程负责生成数据并放入缓冲区,而消费者线程则负责从缓冲区取出数据进行处理。这里的"车库"例子就是...