1、多线程之间按照顺序调用,实现A->B->C 三个线程启动

AA打印5次,BB打印10次,CC打印15次;紧接着,AA打印5次,BB打印10次,CC打印15次。。。。。依次来十轮。

  1. public class ShareResource {
  2. private int number = 1; // a:1 b:2 c:3
  3. private Lock lock = new ReentrantLock();
  4. private Condition c1 = lock.newCondition();
  5. private Condition c2 = lock.newCondition();
  6. private Condition c3 = lock.newCondition();
  7. // a干完后等待,唤起b
  8. public void print5() {
  9. lock.lock();
  10. try {
  11. // 1、判断
  12. while (number != 1) {
  13. c1.await();
  14. }
  15. // 2、干活
  16. for (int i = 0; i < 5; i++) {
  17. System.out.println(Thread.currentThread().getName() + "\t" + i);
  18. }
  19. // 3、通知
  20. number=2;
  21. c2.signal();
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. } finally {
  25. lock.unlock();
  26. }
  27. }
  28. // b干完后等待,唤起c
  29. public void print10() {
  30. lock.lock();
  31. try {
  32. // 1、判断
  33. while (number != 2) {
  34. c2.await();
  35. }
  36. // 2、干活
  37. for (int i = 0; i < 10; i++) {
  38. System.out.println(Thread.currentThread().getName() + "\t" + i);
  39. }
  40. // 3、通知
  41. number=3;
  42. c3.signal();
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. } finally {
  46. lock.unlock();
  47. }
  48. }
  49. // c干完后等待,唤起a
  50. public void print15() {
  51. lock.lock();
  52. try {
  53. // 1、判断
  54. while (number != 3) {
  55. c3.await();
  56. }
  57. // 2、干活
  58. for (int i = 0; i < 15; i++) {
  59. System.out.println(Thread.currentThread().getName() + "\t" + i);
  60. }
  61. // 3、通知
  62. number=1;
  63. c1.signal();
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. } finally {
  67. lock.unlock();
  68. }
  69. }
  70. }
  1. /**
  2. * @description:多线程之间按照顺序调用,实现A->B->C 三个线程启动,要求如下:
  3. * <p>
  4. * AA打印5次,BB打印10次,CC打印5次;
  5. * 紧接着,
  6. * AA打印5次,BB打印10次,CC打印15次
  7. * 。。。。。依次来十轮
  8. * @Author: wangchao
  9. * @Date: 2021/7/25
  10. */
  11. public class Test01 {
  12. public static void main(String[] args) {
  13. ShareResource shareResource = new ShareResource();
  14. // A线程循环了10次,但是第一个循环执行完后便进入的wait阶段,并唤起B,后面9次循环都没开始
  15. new Thread(()->{
  16. for (int i = 0; i < 10; i++) {
  17. shareResource.print5();
  18. }
  19. },"A").start();
  20. // B第一次循环直接进入wait,等被A唤醒后,完成第一次循环,并唤起C,后面9次循环都没开始
  21. new Thread(()->{
  22. for (int i = 0; i < 10; i++) {
  23. shareResource.print10();
  24. }
  25. },"B").start();
  26. // C第一次循环直接进入wait,等被B唤醒后,完成第一次循环,并唤起A,后面9次循环都没开始
  27. new Thread(()->{
  28. for (int i = 0; i < 10; i++) {
  29. shareResource.print15();
  30. }
  31. },"C").start();
  32. }
  33. }