A、B、C三个线程,循环打印ABC,ABC,总计打印十次
问题描述与解决
简单来说,现有A,B,C三个线程,A线程可打印字符A,B线程打印可字符B,C线程可打印字符C,现要求打印出ABC字符串并循环打印十次,每个线程打印的时候其他线程不能打印。这里给出使用lock实现的方法。
代码实现
public class test{
private static int state = 0;
public static void main(String[] args) throws InterruptedException {
final Lock lock = new ReentrantLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// 线程终止条件
while (state<30){
lock.lock();
// 需注意的是这里需要再进行一次state是否小于30的判断,这是因为
// 进行锁竞争时,外层while循环的判断条件已失效,当次线程获取到锁时,
// 当前state的状态与获取锁之前的state状态可能不一致,导致类似幻读的问题。
// 造成的结果就是可能打印的总字符数超过30
if (state%3==0 && state <30){
System.out.println(state + " : A ");
state++;
}
lock.unlock();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (state<30){
lock.lock();
if (state%3==1 && state <30){
System.out.println(state + " : B ");
state++;
}
lock.unlock();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
while (state<30){
lock.lock();
if (state%3==2 && state <30){
System.out.println(state + " : C ");
state++;
}
lock.unlock();
}
}
});
t1.start();
t2.start();
t3.start();
}
}