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

16-案例实现

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

案例实现

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

1.创建一个名为 Operations 的类:

public class Operations {

2.实现一个名为 readData()public static 方法,让当前线程休眠500ms:

public static void readData(){
  try {
    TimeUnit.MILLISECONDS.sleep(500);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

3.实现一个名为 writeData()public static 方法,让当前线程休眠500ms:

public static void writeData(){
  try {
    TimeUnit.MILLISECONDS.sleep(500);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

4.实现一个名为 processData()public static 方法,让当前线程休眠2000ms:

public static void processData(){
  try {
    TimeUnit.SECONDS.sleep(2);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

5.创建一个实现 Runnable 接口的 Task1 类:

public class Task1 implements Runnable {

6.声明一个私有的 Lock 属性,将其命名为 lock

private final Lock lock;

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

public Task1 (Lock lock) {
  this.lock=lock;
}

8.实现 run() 方法。获取锁,调用 Operations 类的3个操作,最后释放锁:

@Override
public void run() {
  lock.lock();
  Operations.readData();
  Operations.processData();
  Operations.writeData();
  lock.unlock();
}

9.实现一个名为 Task2 的类并实现 Runnable 接口:

public class Task2 implements Runnable {

10.声明一个私有的 Lock 属性,并将其命名为 lock

private final Lock lock;

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

public Task2 (Lock lock) {
  this.lock=lock;
}

12.实现 run() 方法。获取锁,调用 readData() ,然后释放锁,接着调用 processData() 方法,然后获取锁,调用 writeData() 操作,最后再释放锁:

@Override
public void run() {
  lock.lock();
  Operations.readData();
  lock.unlock();
  Operations.processData();
  lock.lock();
  Operations.writeData();
  lock.unlock();
}

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

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

14.创建一个 Lock 对象并命名为 lock 、一个 Task1 对象并命名为 task1 、一个 Task2 对象并命名为 task2 ,最后创建一个10个线程的数组:

Lock lock=new ReentrantLock();
Task1 task1=new Task1(lock);
Task2 task2=new Task2(lock);
Thread threads[]=new Thread[10];

15.启动10个线程执行第一个任务,打印执行时间:

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

16.启动10个线程执行第二个任务,打印执行时间:

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