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

04-案例实现

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

案例实现

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

1.创建一个名为 AddTask 的类,然后指定它去实现一个 Runnable 接口:

public class AddTask implements Runnable {

2.声明一个 ConcurrentLinkedDeque<String> 类型的私有属性,将其命名为 list

private final ConcurrentLinkedDeque<String> list;

3.实现这个类的构造函数并初始化其属性:

public AddTask(ConcurrentLinkedDeque<String> list) {
  this.list = list;
}

4.实现这个类的 run() 方法。这个方法会有5000个循环调用。在每个循环里面,我们都将会取双端队列的队头元素和队尾元素,所以共有10000个元素:

@Override
public void run() {
  String name=Thread.currentThread().getName();
  for (int i=0; i < 10000; i++) {
    list.add(name + ": Element " + i);
  }
}

5.创建一个名叫 PollTask 的类,同时指定它实现 Runnable 接口:

public class PollTask implements Runnable {

6.声明一个 ConcurrentLinkedDeque<String> 类型的私有属性,将其命名为 list

private final ConcurrentLinkedDeque<String> list;

7.实现这个类的构造函数并初始化它的属性:

public PollTask(ConcurrentLinkedDeque<String> list) {
  this.list = list;
}

8.实现这个类的 run() 方法。它在一次循环的5000步中取出10000个双端队列元素,同时在每一步中移除两个元素:

@Override
public void run() {
  for(int i=0; i < 5000; i++) {
    list.pollFirst();
    list.pollLast();
  }
}

9.通过实现本案例的 Main 类,并且添加 main() 方法,实现主类:

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

10.创建一个 ConcurrentLinkedDeque<String> 类型的对象,将其命名为 list

ConcurrentLinkedDeque<String> list = new ConcurrentLinkedDeque<>();

11.创建一个有100个 Thread 对象的数组,并将其命名为 threads

Thread threads[]=new Thread[100];

12.创建100个 AddTask 类型的对象和100个线程并且分别执行它们。把每个线程存储在之前已创建好的数组里面并启动它们:

for(int i=0; i<threads.length; i++) {
  AddTask task=new AddTask(list);
  threads[i]=new Thread(task);
  threads[i].start();
}
System.out.printf("Main: %d AddTask threads have been launched\n",
                  threads.length);

13.用 join() 方法来等待线程执行完成:

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

14.在控制台打印数组大小:

System.out.printf("Main: Size of the List: %d\n",list.size());

15.创建100个 PollTask 对象和100个线程并分别执行它们。把每个线程存储在之前已创建好的数组里面并启动它们:

for (int i=0; i < threads.length; i++) {
  PollTask task=new PollTask(list);
  threads[i]=new Thread(task);
  threads[i].start();
}
System.out.printf("Main: %d PollTask threads have been launched\n", 
                  threads.length);

16.用 join() 方法等待线程执行完毕:

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

17.在控制台打印数组大小:

System.out.printf("Main: Size of the List: %d\n",list.size());