上传者: 38581455
|
上传时间: 2025-08-24 13:13:18
|
文件大小: 46KB
|
文件类型: PDF
Java多种方式实现生产者消费者模式
Java中实现生产者消费者模式有多种方式,下面将详细介绍两种方式:使用synchronized和Object的wait和notifyAll方法,使用jdk1.8的Lock和Condition。
方式一:使用synchronized和Object的wait和notifyAll方法
在Java中,使用synchronized关键字可以实现线程同步,wait()方法可以使当前线程阻塞,notify()或notifyAll()方法可以唤醒当前线程。下面是一个示例代码:
```java
class ShareData1 {
public int number = 0;
public synchronized void increment() throws Exception {
while (number != 0) {
this.wait();
}
number++;
System.out.println(Thread.currentThread().getName() + " " + number);
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
while (number != 1) {
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName() + " " + number);
this.notifyAll();
}
}
public class ProdConsumerDemo1 {
public static void main(String[] args) {
ShareData1 shareData = new ShareData1();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
shareData.increment();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, "A").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
shareData.decrement();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, "B").start();
}
}
```
方式二:使用jdk1.8的Lock和Condition
在Java8中,Lock和Condition可以实现线程同步,ReentrantLock可以实现可重入锁,Condition可以实现线程之间的通信。下面是一个示例代码:
```java
class ShareData2 {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws Exception {
lock.lock();
try {
while (number != 0) {
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName() + " " + number);
condition.signalAll();
} finally {
lock.unlock();
}
}
public void decrement() throws InterruptedException {
lock.lock();
try {
while (number != 1) {
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName() + " " + number);
condition.signalAll();
} finally {
lock.unlock();
}
}
}
```
生产者消费者模式的特点
生产者消费者模式是一种经典的多线程同步模式,通过共享资源来实现线程之间的通信。在Java中,使用synchronized和Object的wait和notifyAll方法或jdk1.8的Lock和Condition可以实现生产者消费者模式。这种模式有以下特点:
* 高内聚:生产者和消费者之间的耦合性很高,生产者和消费者之间的交互是紧密的。
* 低耦合:生产者和消费者之间的耦合性很低,生产者和消费者之间的交互是松散的。
应用场景
生产者消费者模式有很多应用场景,例如:
* 多线程之间的数据交换
* 任务队列的实现
* 网络编程中的数据传输
生产者消费者模式是一种经典的多线程同步模式,Java中有多种方式可以实现生产者消费者模式,选择合适的实现方式取决于具体的应用场景。