29-案例实现
案例实现
根据如下步骤实现本案例。
1.先实现生产者。创建一个名为 Producer
的类,并实现 Runnable
接口:
public class Producer implements Runnable {
2.声明一个名为 buffer
的 List<String>
类型的属性——作为生产者交换给消费者的数据结构:
private List<String> buffer;
3.声明一个名为 exchanger
的 Exchanger<List<String>>
类型的属性——用来同步生产者和消费者:
private final Exchanger<List<String>> exchanger;
4.实现该类的构造器,并初始化上述两个属性:
public Producer (List<String> buffer, Exchanger<List<String>>
exchanger){
this.buffer=buffer;
this.exchanger=exchanger;
}
5.实现 run()
方法。在方法内循环10次数据交换:
@Override
public void run() {
for (int cycle = 1; cycle <= 10; cycle++){
System.out.printf("Producer: Cycle %d\n",cycle);
6.在每个循环中,向缓冲区添加10个字符串:
for (int j=0; j<10; j++){
String message="Event "+(((cycle-1)*10)+j);
System.out.printf("Producer: %s\n",message);
buffer.add(message);
}
7.调用 exchange()
方法,与消费者进行数据交换。该方法会抛出 InterruptedException
异常,因此需要进行异常处理:
try {
buffer=exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Producer: "+buffer.size());
}
8.接着实现消费者。创建一个名为 Consumer
的类,并实现 Runnable
接口:
public class Consumer implements Runnable {
9.声明一个名为 buffer
的 List<String>
类型的属性——作为消费者交换给生产者的数据结构:
private List<String> buffer;
10.声明一个名为 exchanger
的 Exchanger<List<String>>
类型的属性——用来同步生产者和消费者:
private final Exchanger<List<String>> exchanger;
11.实现该类的构造器,并初始化上述两个属性:
public Consumer(List<String> buffer, Exchanger<List<String>>
exchanger){
this.buffer=buffer;
this.exchanger=exchanger;
}
12.实现 run()
方法。在方法内循环10次数据交换:
@Override
public void run() {
for (int cycle=1; cycle <= 10; cycle++){
System.out.printf("Consumer: Cycle %d\n",cycle);
13.在每次循环当中,都应先调用 exchange()
方法与生产者进行同步,从而获取消费者需要的数据。该方法会抛出 InterruptedException
异常,因此需要进行异常处理:
try {
buffer=exchanger.exchange(buffer);
} catch (InterruptedException e) {
e.printStackTrace();
}
14.同步后将从生产者处获得的10个字符串输出到控制台后删除,并将 buffer
列表清空:
System.out.println("Consumer: "+buffer.size());
for (int j=0; j<10; j++){
String message=buffer.get(0);
System.out.println("Consumer: "+message);
buffer.remove(0);
}
}
15.实现本案例主程序的入口 main()
方法:
public class Main {
public static void main(String[] args) {
16.创建两个将在生产者和消费者中使用的 buffer
:
List<String> buffer1=new ArrayList<>();
List<String> buffer2=new ArrayList<>();
17.创建 Exchanger
对象。该对象用来同步生产者和消费者:
Exchanger<List<String>> exchanger=new Exchanger<>();
18.创建生产者和消费者对象:
Producer producer=new Producer(buffer1, exchanger);
Consumer consumer=new Consumer(buffer2, exchanger);
19.分别创建并启动两个线程,用来执行生产者和消费者:
Thread threadProducer=new Thread(producer);
Thread threadConsumer=new Thread(consumer);
threadProducer.start();
threadConsumer.start();