把上一篇的代码改的优美了不少,虽然还是有小瑕疵,如:
1、还是有很小的几率产生第一个唤醒第二个线程时第二个线程还未等待(第一个线程真是太快了)
2、为解决上述问题所以sleep(10)、从后向前start(),其实并不是一个很好的方法
public class GongdanHandler2 extends Thread{
private static int num = 1;
private int id;
private Lock lock;
private Condition self;
private Condition next;
public GongdanHandler2(int id, Lock lock, Condition self, Condition next){
this.id = id;
this.lock = lock;
this.self = self;
this.next = next;
}
public void run(){
while (num <= 1000) {
try {
lock.lock();
System.out.println(id + "等待");
if(num != 1 || id != 1) {
self.await();
}
Thread.sleep(10);
if(num > 1000){
//使各个线程能够正常结束
next.signal();
break;
}
//因为有锁唤醒呀,不需要if(id == num % 3)判断了逗比
System.out.println("线程" + id + "处理:" + num);
num++;
next.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public static void main(String[] args) {
//初始化可重入锁
final Lock lock = new ReentrantLock();
final Condition reachOneCondition = lock.newCondition();
final Condition reachTwoCondition = lock.newCondition();
final Condition reachThreeCondition = lock.newCondition();
GongdanHandler2 t1 = new GongdanHandler2(1, lock, reachOneCondition, reachTwoCondition);
GongdanHandler2 t2 = new GongdanHandler2(2, lock, reachTwoCondition, reachThreeCondition);
GongdanHandler2 t3 = new GongdanHandler2(3, lock, reachThreeCondition, reachOneCondition);
t3.start();
t2.start();
t1.start();
}
}