31-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建 Task1
类,该类实现了 Runnable
接口:
public class Task1 implements Runnable {
2.添加两个 Lock
类型的私有属性 lock1
和 lock2
:
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.按照先 lock2
后 lock1
的顺序,分别释放锁:
lock2.unlock();
lock1.unlock();
}
7.创建 Task2
类,该类实现了 Runnable
方法:
public class Task2 implements Runnable{
8.添加两个 Lock
类型的私有属性,将其分别命名为 lock1
和 lock2
:
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.按照先 lock1
后 lock2
的顺序,分别释放锁:
lock1.unlock();
lock2.unlock();
}
13.实现本案例的主类,新建 Main
类和 main()
方法:
public class Main {
14.分别创建两个锁对象,即 lock1
和 lock2
:
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
对象的线程时的情形如下图所示,当前线程暂停在断点处,而其他线程仍然正常运行:
21.暂停主线程。单击右键,选中该线程,选择 Suspend 。修改成功后, Debugging 面板如下图所示。
22.重启暂停的两个线程,分别选中它们并通过 Resume 选项重启线程。