三个线程轮流打印,A打印1,2,3,4,B打印5,6,7,8,C打印9,10,11,12,再到A打印13,14,15,16…
public class TestMutiThreadPrint {
public static void main(String[] args) throws InterruptedException {
Resource resource = new Resource();
while (true){
new Thread(() -> {
try {
resource.incresement1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "A").start();
new Thread(() -> {
try {
resource.incresement2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "B").start();
new Thread(() -> {
try {
resource.incresement3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "C").start();
Thread.sleep(100);
resource.signalA();
}
}
}
class Resource {
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
private int num = 0;
public void signalA(){
lock.lock();
try{
condition1.signal();
}finally {
lock.unlock();
}
}
public void incresement1() throws InterruptedException {
lock.lock();
try {
condition1.await();
for (int i = 0; i < 4; i++) {
num++;
System.out.println(Thread.currentThread().getName() + "->" + num);
}
//通知其他线程对其操作
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void incresement2() throws InterruptedException {
lock.lock();
try {
condition2.await();
for (int i = 0; i < 4; i++) {
num++;
System.out.println(Thread.currentThread().getName() + "->" + num);
}
//通知其他线程对其操作
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void incresement3() throws InterruptedException {
lock.lock();
try {
condition3.await();
for (int i = 0; i < 4; i++) {
num++;
System.out.println(Thread.currentThread().getName() + "->" + num);
}
//通知其他线程对其操作
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}