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()));