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());