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

31-案例实现

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

案例实现

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

1.创建 Task1 类,该类实现了 Runnable 接口:

public class Task1 implements Runnable {

2.添加两个 Lock 类型的私有属性 lock1lock2

private Lock lock1, lock2;

3.实现类的构造函数,初始化上述对象:

public Task1 (Lock lock1, Lock lock2) {
  this.lock1=lock1;
  this.lock2=lock2;
}

4.实现 run() 方法,在方法中通过 lock() 方法获得 lock1 对象,然后在控制台中输出信息,以表示当前线程已经获得了锁:

@Override
public void run() {
  lock1.lock();
  System.out.printf("Task 1: Lock 1 locked\n");

5.通过 lock() 方法获得 lock2 的控制权,并输出信息,以表示当前线程已经成功获得了锁:

lock2.lock();
System.out.printf("Task 1: Lock 2 locked\n");

6.按照先 lock2lock1 的顺序,分别释放锁:

  lock2.unlock();
  lock1.unlock();
}

7.创建 Task2 类,该类实现了 Runnable 方法:

public class Task2 implements Runnable{

8.添加两个 Lock 类型的私有属性,将其分别命名为 lock1lock2

private Lock lock1, lock2;

9.实现类的构造函数,并完成属性的初始化:

public Task2(Lock lock1, Lock lock2) {
  this.lock1=lock1;
  this.lock2=lock2;
}

10.实现 run() 方法。首先,通过 lock() 方法获得锁 lock2 ,在控制台中输出信息以表示当前线程已经获得了锁:

@Override
public void run() {
  lock2.lock();
  System.out.printf("Task 2: Lock 2 locked\n");

11.通过 lock() 获得 lock1 的控制权,在控制台中输出信息以表示当前线程已经获得了锁:

lock1.lock();
System.out.printf("Task 2: Lock 1 locked\n");

12.按照先 lock1lock2 的顺序,分别释放锁:

  lock1.unlock();
  lock2.unlock();
}

13.实现本案例的主类,新建 Main 类和 main() 方法:

public class Main {

14.分别创建两个锁对象,即 lock1lock2

Lock lock1, lock2;
lock1=new ReentrantLock();
lock2=new ReentrantLock();

15.创建 Task1 类型的对象 task1

Task1 task1=new Task1(lock1, lock2);

16.创建 Task2 类型的对象 task2

Task2 task2=new Task2(lock1, lock2);

17.使用两个线程分别执行不同的任务:

Thread thread1=new Thread(task1);
Thread thread2=new Thread(task2);
thread1.start();
thread2.start();

18.在两项任务执行完成后,每隔500ms打印一条消息到控制台上。用 isAlive() 方法来检查一个线程是否完成了执行:

while ((thread1.isAlive()) &&(thread2.isAlive())) {
  System.out.println("Main: The example is"+ "running");
  try {
    TimeUnit.MILLISECONDS.sleep(500);
  } catch (InterruptedException ex) {
    ex.printStackTrace();
  }
}

19.在 Task 类的 run() 方法中的第一个 printf() 方法的调用处添加断点。

20.调试上述应用代码,在NetBeans窗口的左上角看到 Debugging 窗口。执行 Task1 对象的线程时的情形如下图所示,当前线程暂停在断点处,而其他线程仍然正常运行:

81.png 21.暂停主线程。单击右键,选中该线程,选择 Suspend 。修改成功后, Debugging 面板如下图所示。

82.png 22.重启暂停的两个线程,分别选中它们并通过 Resume 选项重启线程。