本文为看视频学习笔记,若有错误请指正,谢谢!
例题:编写一个程序,开启3个线程,这3个线程的ID分别是A,B,C,每个线程将自己的ID在屏幕上面打印10遍,要求输出的结果必须按顺序显示。例如:ABCABCABC……一次递归
代码:
public class TestABCAlternate {
public static void main(String[] args){
AlternateDemo alternateDemo = new AlternateDemo();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
alternateDemo.loopA(i);
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
alternateDemo.loopB(i);
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
alternateDemo.loopC(i);
}
}
},"C").start();
}
}
class AlternateDemo{
private int number = 1;//用来标记当前正在执行的线程
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void loopA(int totalLoop){
lock.lock();
try {
if(number != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
number = 2;
condition2.signal();
}finally {
lock.unlock();
}
}
public void loopB(int totalLoop){
lock.lock();
try {
if(number != 2){
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
number = 3;
condition3.signal();
}finally {
lock.unlock();
}
}
public void loopC(int totalLoop){
lock.lock();
try {
if(number != 3){
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() +"\t"+ totalLoop);
System.out.println("============");
number = 1;
condition1.signal();
}finally {
lock.unlock();
}
}
}
运行结果:
如果对这个题目进行进一步的衍生,比如要求输出的结果是“ABBCCCABBCCCABBCCC……“,那么我们就对代码做出相应的改变。
public void loopA(int totalLoop){
lock.lock();
try {
if(number != 1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <= 1 ; i++) {
System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t"+totalLoop);
}
number = 2;
condition2.signal();
}finally {
lock.unlock();
}
}
public void loopB(int totalLoop){
lock.lock();
try {
if(number != 2){
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <= 2 ; i++) {
System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t" + totalLoop);
}
number = 3;
condition3.signal();
}finally {
lock.unlock();
}
}
public void loopC(int totalLoop){
lock.lock();
try {
if(number != 3){
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i <=3 ; i++) {
System.out.println(Thread.currentThread().getName() +"\t"+ i + "\t"+ totalLoop);
}
System.out.println("============");
number = 1;
condition1.signal();
}finally {
lock.unlock();
}
}
运行的结果: