目标:三个线程交替打印数字,如线程t1、t2、t3依次打印1、2、3,然后再依次打印4、5、6,直到完成1~100的打印。

    实现方式:需要使用线程的等待/通知机制。

    线程t1的任务为:

    1. Thread t1 = new Thread(() -> {
    2. for (int i = 1; i <= num;) {
    3. lock.lock();
    4. boolean skip = true;
    5. try{
    6. while (i % threadNum == 1) {
    7. LOGGER.info("{}", i);
    8. cd2.signal();
    9. i ++;
    10. skip = false;
    11. cd1.await();
    12. }
    13. if (skip) {
    14. i ++;
    15. }
    16. if (i== num) {
    17. cd2.signal();
    18. }
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. } finally {
    22. lock.unlock();
    23. }
    24. }
    25. }, "t1");
    26. t1.start();

    线程t2的任务为:

    1. Thread t2 = new Thread(() -> {
    2. for (int i = 1; i <= num; ) {
    3. lock.lock();
    4. try{
    5. boolean skip = true;
    6. while (i % threadNum == 2) {
    7. LOGGER.info("{}", i);
    8. cd3.signal();
    9. skip = false;
    10. i ++;
    11. cd2.await();
    12. }
    13. if (skip) {
    14. i ++;
    15. }
    16. if (i == num) {
    17. cd3.signal();
    18. }
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. } finally {
    22. lock.unlock();
    23. }
    24. }
    25. }, "t2");
    26. t2.start();

    线程t3的任务为:

    1. Thread t3 = new Thread(() -> {
    2. for(int i = 1; i <= num;) {
    3. lock.lock();
    4. try{
    5. boolean skip = true;
    6. while (i % threadNum == 0) {
    7. LOGGER.info("{}", i);
    8. cd1.signal();
    9. i ++;
    10. skip = false;
    11. cd3.await();
    12. }
    13. if (skip) {
    14. i ++;
    15. }
    16. if (i == num) {
    17. cd1.signal();
    18. }
    19. } catch (InterruptedException e) {
    20. e.printStackTrace();
    21. } finally {
    22. lock.unlock();
    23. }
    24. }
    25. }, "t3");
    26. t3.start();

    注意:cd1、cd2、cd3是某一个锁的Condition。

    还有其他的实现方式,这里暂时先不给出。