目标:三个线程交替打印数字,如线程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。
还有其他的实现方式,这里暂时先不给出。
