32-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个 Incrementer
类并实现 Runnable
接口:
public class Incrementer implements Runnable {
2.声明一个 AtomicIntegerArray
类型的 vector
私有字段来存储整型数组:
private final AtomicIntegerArray vector;
3.实现该类的构造方法来初始化字段:
public Incrementer(AtomicIntegerArray vector) {
this.vector=vector;
}
4.实现 run()
方法。通过 getAndIncrement()
方法来增加数组中所有元素的值:
@Override
public void run() {
for (int i=0; i<vector.length(); i++){
vector.getAndIncrement(i);
}
}
5.创建一个 Decrementer
类并实现 Runnable
接口:
public class Decrementer implements Runnable {
6.声明一个 AtomicIntegerArray
类型的 vector
私有字段来存储整型数组:
private AtomicIntegerArray vector;
7.实现该类的构造方法并初始化其字段:
public Decrementer(AtomicIntegerArray vector) {
this.vector=vector;
}
8.实现 run()
方法。通过 getAndDecrement()
方法来减少数组中所有元素的值:
@Override
public void run() {
for (int i=0; i<vector.length(); i++) {
vector.getAndDecrement(i);
}
}
9.实现 Main
类作为主类,并添加 main()
方法:
public class Main {
public static void main(String[] args) {
10.声明一个 THREADS
常量并赋值100。创建一个带有1000个元素的 AtomicInteger-Array
对象:
final int THREADS=100;
AtomicIntegerArray vector=new AtomicIntegerArray(1000);
11.创建一个 Incrementer
的任务来处理之前已创建的原子性数组:
Incrementer incrementer=new Incrementer(vector);
12.创建一个 Decrementer
的任务来处理之前已创建的原子性数组:
Decrementer decrementer=new Decrementer(vector);
13.创建两个数组来分别存储100个线程对象:
Thread threadIncrementer[]=new Thread[THREADS];
Thread threadDecrementer[]=new Thread[THREADS];
14.创建并启动100条线程来执行 Incrementer
的任务,并且创建并启动另外100个线程来执行 Decrementer
的任务。保存这些线程之前已创建的数组:
for (int i=0; i<THREADS; i++) {
threadIncrementer[i]=new Thread(incrementer);
threadDecrementer[i]=new Thread(decrementer);
threadIncrementer[i].start();
threadDecrementer[i].start();
}
15.用 join()
方法来等待所有线程执行完成:
for (int i=0; i<100; i++) {
try {
threadIncrementer[i].join();
threadDecrementer[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
16.在控制台从0开始打印不为0的原子数组元素。用 get()
方法来获取原子性数组的元素:
int errors=0;
for (int i=0; i<vector.length(); i++) {
if (vector.get(i)!=0) {
System.out.println("Vector["+i+"] : "+vector.get(i));
errors++;
}
}
if (errors==0) {
System.out.printf("No errors found\n");
}
17.在控制台打印一条关于程序执行的信息:
System.out.println("Main: End of the example");