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

12-案例实现

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

案例实现

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

1.创建 Producer 类并实现 Runnable 接口:

public class Producer implements Runnable {

2.声明一个私有的 buffer 属性,其类型为 LinkedTransferQueue

private LinkedTransferQueue<String> buffer;

3.声明一个私有的 String 类型属性,将其命名为 name ,作为生产者的名称:

private String name;

4.实现构造器并初始化这些属性:

public Producer(String name, LinkedTransferQueue<String> buffer){
  this.name=name;
  this.buffer=buffer;
}

5.实现 run() 方法。用 buffer 对象的 put() 方法在缓冲区里存储10000个字符串,然后打印一条信息以表明该方法执行结束:

@Override
public void run() {
  for (int i=0; i<10000; i++) {
    buffer.put(name+": Element "+i);
  }
  System.out.printf("Producer: %s: Producer done\n",name);
}

6.创建 Consumer 类并实现 Runnable 接口:

public class Consumer implements Runnable {

7.声明一个私有的 buffer 属性,其类型为 LinkedTransferQueue

private LinkedTransferQueue<String> buffer;

8.声明一个私有的 String 类型属性,并命名为 name 作为消费者的名称:

private String name;

9.实现构造器并初始化这些属性:

public Consumer(String name, LinkedTransferQueue<String> buffer){
  this.name=name;
  this.buffer=buffer;
}

10.实现 run() 方法。用 buffer 对象的 take() 方法从缓冲区里取出10000个字符串,然后打印一条信息来表明该方法执行结束:

@Override
public void run() {
  for (int i=0; i<10000; i++){
    try {
      buffer.take();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
  System.out.printf("Consumer: %s: Consumer done\n",name);
}

11.实现本案例的主类,创建 Main 类并添加 main() 方法:

public class Main {
  public static void main(String[] args) {

12.声明常量 THREADS ,将其设置为100。创建一个 LinkedTransferQueue 变量,并命名为 buffer

final int THREADS=100;
LinkedTransferQueue<String> buffer=new LinkedTransferQueue<>();

13.创建一个大小为100的线程数组,用来执行100次生产任务:

Thread producerThreads[]=new Thread[THREADS];

14.创建一个大小为100的线程数组,用来执行100次消费任务:

Thread consumerThreads[]=new Thread[THREADS];

15.创建并启动100个 Consumer 对象,将它们存储到上面创建的数组中:

for (int i=0; i<THREADS; i++){
  Consumer consumer=new Consumer("Consumer "+i,buffer);
  consumerThreads[i]=new Thread(consumer);
  consumerThreads[i].start();
}

16.创建并启动100个 Producer 对象,将它们存储到上面创建的数组中:

for (int i=0; i<THREADS; i++) {
  Producer producer=new Producer("Producer: "+ i , buffer);
  producerThreads[i]=new Thread(producer);
  producerThreads[i].start();
}

17.用 join() 方法等待线程结束:

for (int i=0; i<THREADS; i++){
  try {
    producerThreads[i].join();
    consumerThreads[i].join();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

18.打印 buffer 的大小和结束信息:

System.out.printf("Main: Size of the buffer: %d\n",
                  buffer.size());
System.out.printf("Main: End of the example\n");