目标:三个线程交替打印数字,如线程t1、t2、t3依次打印1、2、3,然后再依次打印4、5、6,直到完成1~100的打印。
实现方式:需要使用线程的等待/通知机制。
线程t1的任务为:
Thread t1 = new Thread(() -> {
for (int i = 1; i <= num;) {
lock.lock();
boolean skip = true;
try{
while (i % threadNum == 1) {
LOGGER.info("{}", i);
cd2.signal();
i ++;
skip = false;
cd1.await();
}
if (skip) {
i ++;
}
if (i== num) {
cd2.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "t1");
t1.start();
线程t2的任务为:
Thread t2 = new Thread(() -> {
for (int i = 1; i <= num; ) {
lock.lock();
try{
boolean skip = true;
while (i % threadNum == 2) {
LOGGER.info("{}", i);
cd3.signal();
skip = false;
i ++;
cd2.await();
}
if (skip) {
i ++;
}
if (i == num) {
cd3.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "t2");
t2.start();
线程t3的任务为:
Thread t3 = new Thread(() -> {
for(int i = 1; i <= num;) {
lock.lock();
try{
boolean skip = true;
while (i % threadNum == 0) {
LOGGER.info("{}", i);
cd1.signal();
i ++;
skip = false;
cd3.await();
}
if (skip) {
i ++;
}
if (i == num) {
cd1.signal();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "t3");
t3.start();
注意:cd1、cd2、cd3是某一个锁的Condition。
还有其他的实现方式,这里暂时先不给出。