简单的多线程题,采用设置执行屏障
题目描述:三个不同的线程将会共用一个 类实例。
线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class tryleetcode {
static ReentrantLock lock=new ReentrantLock();
static Condition condition=lock.newCondition();
static boolean flag1=false;
static boolean flag2=false;
public void one() {
System.out.println("one!");
}
public void two() {
System.out.println("two!");
}
public void three() {
System.out.println("three!");
}
public static void main(String[] args) throws InterruptedException {
tryleetcode tryleetcode=new tryleetcode();
Runnable t1=new Runnable() {
@Override
public void run() {
lock.lock();
// TODO Auto-generated method stub
tryleetcode.one();
flag1=true;
condition.signalAll();
lock.unlock();
}
};
Runnable t2=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
lock.lock();
while (!flag1) {
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
tryleetcode.two();
flag2=true;
condition.signalAll();
lock.unlock();
}
};
Runnable t3=new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
lock.lock();
while (!flag2) {
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
tryleetcode.three();
lock.unlock();
}
};
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
Thread.sleep(2000);
}
}