java生产者消费者进程同步
时间: 2024-12-30 09:18:29 浏览: 12
### Java 中生产者消费者模型的进程同步实现
在Java中,可以通过多种方式实现生产者消费者模式下的进程同步。一种常见的方式是使用`BlockingQueue`接口及其具体实现类来简化线程之间的通信和同步操作[^2]。
#### 使用 `BlockingQueue`
`BlockingQueue` 是一个阻塞队列,当试图从空队列获取元素时会自动阻塞当前线程直到有可用的数据项;同样地,在向已满的队列添加新数据时也会使调用方进入等待状态直至空间被释放。这使得编写无竞争条件且易于理解的并发程序变得简单得多。
下面展示了一个简单的例子:
```java
import java.util.concurrent.*;
class Producer implements Runnable {
private final BlockingQueue<Integer> queue;
public Producer(BlockingQueue<Integer> q) { this.queue = q; }
@Override
public void run() {
try {
while(true){
Integer item = produce();
System.out.println("Produced: " + item);
queue.put(item); // 如果队列满了,则此方法将会阻塞
Thread.sleep((long)(Math.random()*100));
}
} catch (InterruptedException e) {}
}
private int count=0;
private Integer produce(){
return ++count;
}
}
class Consumer implements Runnable {
private final BlockingQueue<Integer> queue;
public Consumer(BlockingQueue<Integer> q){this.queue=q;}
@Override
public void run() {
try{
while(true){
Integer value = queue.take(); // 若队列为空,则此方法将会阻塞
consume(value);
System.out.println("Consumed: "+value);
Thread.sleep((long)(Math.random()*100));
}
}catch(InterruptedException ex){}
}
private void consume(Integer item){
// 处理逻辑...
}
}
```
为了启动生产和消费过程,可以在主线程中创建并启动多个生产者和消费者的实例:
```java
public class Main {
public static void main(String[] args)throws Exception {
BlockingQueue<Integer> sharedQueue = new LinkedBlockingDeque<>(10);
ExecutorService executor = Executors.newFixedThreadPool(5);
for(int i=0;i<3;++i)
executor.execute(new Producer(sharedQueue));
for(int j=0;j<2;++j)
executor.execute(new Consumer(sharedQueue));
TimeUnit.SECONDS.sleep(5);
executor.shutdownNow();
System.out.println("\n\nALL Producers and Consumers have finished their work.");
}
}
```
这段代码展示了如何通过`ExecutorService`管理一组工作线程池,并分配给它们具体的任务——即运行生产者或消费者对象中的业务逻辑。这里还设置了定时器以便让整个应用程序能够在一定时间之后正常退出。
阅读全文