import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* @title 两个线程依次交替执行
* @description
* @author
* @since
*/
public class AlternateRun2 implements Runnable {
private int tnum = 1;// 线程编号,Thread Number
private ReentrantLock lock = new ReentrantLock();//锁
private Condition chang = lock.newCondition();
private Condition duan = lock.newCondition();
public static void main(String[] args) {
new AlternateRun2().run();
}
@Override
public void run() {
new Thread(new RedThread(), "长长长长长长长长长长长长长长长长长长长长长长长长").start();
new Thread(new GreenThread(), "短短短短短").start();
}
class RedThread implements Runnable {
@Override
public void run() {
while (true) {
try {
lock.lock();
while (tnum != 1) {// 判断是否该自己执行了[采用while不是if是为了防止死锁]
chang.await();
}
System.out.println(Thread.currentThread().getName()+ " is flashing...");
//TimeUnit.SECONDS.sleep(1);// 停留时间,便于从控制台观看
tnum = 2;
duan.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
class GreenThread implements Runnable {
@Override
public void run() {
while (true) {
try {
lock.lock();
while (tnum != 2) {
duan.await();
}
System.out.println(Thread.currentThread().getName()+ " is flashing...");
//TimeUnit.SECONDS.sleep(1);// 停留时间,便于从控制台观看
tnum = 1;
chang.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
}
转载于:https://my.oschina.net/cshuangxi/blog/228508