练习:让两个线程一前一后地循环执行
这里利用Contition来实现。
注意:条件的释放需要在另外一个线程开始等待之后,否则如果是线程1先释放条件1,线程2再等待条件1,那线程2会一直等待下去
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* @创建人 xiaoshi
* @创建时间 2020/4/4
* @描述 练习Condition控制线程并发:两个线程串行执行:两个条件
*/
public class ConditionDemo2 {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private Condition condition2 = lock.newCondition();
public void leftFoot(){
try{
lock.lock();
Thread t = Thread.currentThread();
String name = t.getName();
//System.out.println(name+"获取了锁");
// System.out.println(name+"等待右脚迈出");
condition.await();
Thread.sleep(500);
System.out.println(name+"迈出左脚");
Thread.sleep(500);
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
// System.out.println(Thread.currentThread().getName()+"释放了锁");
}
}
public void rightFoot(){
try{
lock.lock();
Thread t = Thread.currentThread();
String name = t.getName();
//System.out.println(name+"获取了锁");
Thread.sleep(1000);
condition.signal();
System.out.println(name+"迈出右脚");
Thread.sleep(500);
//System.out.println(name+"等待左脚迈出");
condition2.await();
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
//System.out.println(Thread.currentThread().getName()+"释放了锁");
}
}
private void startWalk(){
try {
lock.lock();
condition2.signal();
System.out.println("开始");
}catch (Exception e){
e.printStackTrace();
}finally{
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ConditionDemo2 demo2 = new ConditionDemo2();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
demo2.rightFoot();
}
}
});
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
demo2.leftFoot();
}
}
});
thread1.start();
thread.start();
}
}