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

13-案例实现

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

案例实现

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

1.创建一个实现了 Runnable 接口的 TaskAtomic 类:

public class TaskAtomic implements Runnable {

2.声明一个私有的 AtomicInteger 属性并命名为 number

private final AtomicInteger number;

3.实现该类的构造器并初始化属性:

public TaskAtomic () {
  this.number=new AtomicInteger();
}

4.实现 run() 方法。在一个1000000次的循环中,使用 set() 方法将循环的次数设置为原子属性的值:

@Override
public void run() {
  for (int i=0; i<1000000; i++) {
    number.set(i);
  }
}

5.创建一个名为 TaskLock 的类并实现 Runnable 接口:

public class TaskLock implements Runnable {

6.声明一个私有的 int 型属性并命名为 number ,以及一个私有的 Lock 属性并命名为 lock

private Lock lock;
private int number;

7.实现该类的构造器并初始化属性:

public TaskLock() {
  this.lock=new ReentrantLock();
}

8.实现 run() 方法。在一个1000000次的循环中,把循环的次数设置到 int 型的属性上。设置前加锁,设置后释放锁:

@Override
public void run() {
  for (int i=0; i<1000000; i++) {
    lock.lock();
    number=i;
    lock.unlock();
  }
}

9.实现主类,创建一个名为 Main 的类,并为其添加 main() 方法:

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

10.创建一个 TaskAtomic 对象,并将其命名为 atomicTask

TaskAtomic atomicTask=new TaskAtomic();

11.创建一个 TaskLock 对象,并将其命名为 lockTask

TaskLock lockTask=new TaskLock();

12.声明线程的数量并创建一个 Thread 对象数组来存储线程:

int numberThreads=50;
Thread threads[]=new Thread[numberThreads];
Date begin, end;

13.运行指定数量的线程以执行 TaskLock 对象。计算执行时间,并打印到控制台:

begin=new Date();
for (int i=0; i<numberThreads; i++) {
  threads[i]=new Thread(lockTask);
  threads[i].start();
}
for (int i=0; i<numberThreads; i++) {
  try {
    threads[i].join();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}
end=new Date();
System.out.printf("Main: Lock results: %d\n",
                  (end.getTime()-begin.getTime()));

14.运行指定数量的线程以执行 TaskAtomic 对象。计算执行时间,并打印到控制台:

begin=new Date();
for (int i=0; i<numberThreads; i++) {
  threads[i]=new Thread(atomicTask);
  threads[i].start();
}
for (int i=0; i<numberThreads; i++) {
  try {
    threads[i].join();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}
end=new Date();
System.out.printf("Main: Atomic results: %d\n",
                  (end.getTime()-begin.getTime()));