当前位置:嗨网首页>书籍在线阅读

29-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤实现本案例。

1.先实现生产者。创建一个名为 Producer 的类,并实现 Runnable 接口:

public class Producer implements Runnable {

2.声明一个名为 bufferList<String> 类型的属性——作为生产者交换给消费者的数据结构:

private List<String> buffer;

3.声明一个名为 exchangerExchanger<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.声明一个名为 bufferList<String> 类型的属性——作为消费者交换给生产者的数据结构:

private List<String> buffer;

10.声明一个名为 exchangerExchanger<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();