有顺序的唤醒线程

    说几个重点:
    因为线程是根据cpu随机调度的,所以,这个是不确定的,但是,你进了方法,你不符合条件,我就让你干等,
    这样我就实现了线程的顺序执行。
    A抢到锁了,必须等A把锁释放,其他人才能再抢到锁走自己的逻辑。。。

    A 执行完调用B,B执行完调用C,C执行完调用A

    1. package com.juc.等待唤醒;
    2. import java.util.concurrent.locks.Condition;
    3. import java.util.concurrent.locks.Lock;
    4. import java.util.concurrent.locks.ReentrantLock;
    5. /**
    6. * A 执行完调用B,B执行完调用C,C执行完调用A
    7. */
    8. public class C {
    9. public static void main(String[] args) {
    10. Data3 data = new Data3();
    11. new Thread(()->{
    12. for (int i = 0; i <10 ; i++) {
    13. data.printA();
    14. }
    15. },"A").start();
    16. new Thread(()->{
    17. for (int i = 0; i <10 ; i++) {
    18. data.printB();
    19. }
    20. },"B").start();
    21. new Thread(()->{
    22. for (int i = 0; i <10 ; i++) {
    23. data.printC();
    24. }
    25. },"C").start();
    26. }
    27. }
    28. class Data3{ // 资源类 Lock
    29. private Lock lock = new ReentrantLock();
    30. private Condition condition1 = lock.newCondition();
    31. private Condition condition2 = lock.newCondition();
    32. private Condition condition3 = lock.newCondition();
    33. private int number = 1; // 1A 2B 3C
    34. public void printA(){
    35. System.out.println("A进来了~~~~");
    36. lock.lock();
    37. try {
    38. // 业务,判断-> 执行-> 通知
    39. while (number!=1){
    40. // 等待
    41. condition1.await();
    42. }
    43. System.out.println(Thread.currentThread().getName()+"=>AAAAAAA");
    44. // 唤醒,唤醒指定的人,B
    45. number = 2;
    46. condition2.signal();
    47. } catch (Exception e) {
    48. e.printStackTrace();
    49. } finally {
    50. System.out.println("A释放锁完毕");
    51. lock.unlock();
    52. }
    53. }
    54. public void printB(){
    55. System.out.println("B进来了~~~~");
    56. lock.lock();
    57. try {
    58. // 业务,判断-> 执行-> 通知
    59. while (number!=2){
    60. condition2.await();
    61. }
    62. System.out.println(Thread.currentThread().getName()+"=>BBBBBBBBB");
    63. // 唤醒,唤醒指定的人,c
    64. number = 3;
    65. condition3.signal();
    66. } catch (Exception e) {
    67. e.printStackTrace();
    68. } finally {
    69. System.out.println("B释放锁完毕");
    70. lock.unlock();
    71. }
    72. }
    73. public void printC(){
    74. System.out.println("C进来了~~~~");
    75. lock.lock();
    76. try {
    77. // 业务,判断-> 执行-> 通知
    78. // 业务,判断-> 执行-> 通知
    79. while (number!=3){
    80. condition3.await();
    81. }
    82. System.out.println(Thread.currentThread().getName()+"=>CCCCCCC");
    83. // 唤醒,唤醒指定的人,c
    84. number = 1;
    85. condition1.signal();
    86. } catch (Exception e) {
    87. e.printStackTrace();
    88. } finally {
    89. System.out.println("C释放锁完毕");
    90. lock.unlock();
    91. }
    92. }
    93. }
    1. B进来了~~~~
    2. A进来了~~~~
    3. C进来了~~~~
    4. A=>AAAAAAA
    5. A释放锁完毕
    6. A进来了~~~~
    7. B=>BBBBBBBBB
    8. B释放锁完毕
    9. B进来了~~~~
    10. C=>CCCCCCC
    11. C释放锁完毕
    12. C进来了~~~~
    13. A=>AAAAAAA
    14. A释放锁完毕
    15. A进来了~~~~
    16. B=>BBBBBBBBB
    17. B释放锁完毕
    18. B进来了~~~~
    19. C=>CCCCCCC
    20. C释放锁完毕
    21. C进来了~~~~
    22. A=>AAAAAAA
    23. A释放锁完毕
    24. A进来了~~~~
    25. B=>BBBBBBBBB
    26. B释放锁完毕
    27. B进来了~~~~
    28. C=>CCCCCCC
    29. C释放锁完毕
    30. C进来了~~~~
    31. A=>AAAAAAA
    32. A释放锁完毕
    33. A进来了~~~~
    34. B=>BBBBBBBBB
    35. B释放锁完毕
    36. B进来了~~~~
    37. C=>CCCCCCC
    38. C释放锁完毕
    39. C进来了~~~~
    40. A=>AAAAAAA
    41. A释放锁完毕
    42. A进来了~~~~
    43. B=>BBBBBBBBB
    44. B释放锁完毕
    45. B进来了~~~~
    46. C=>CCCCCCC
    47. C释放锁完毕
    48. C进来了~~~~
    49. A=>AAAAAAA
    50. A释放锁完毕
    51. A进来了~~~~
    52. B=>BBBBBBBBB
    53. B释放锁完毕
    54. B进来了~~~~
    55. C=>CCCCCCC
    56. C释放锁完毕
    57. C进来了~~~~
    58. A=>AAAAAAA
    59. A释放锁完毕
    60. A进来了~~~~
    61. B=>BBBBBBBBB
    62. B释放锁完毕
    63. B进来了~~~~
    64. C=>CCCCCCC
    65. C释放锁完毕
    66. C进来了~~~~
    67. A=>AAAAAAA
    68. A释放锁完毕
    69. A进来了~~~~
    70. B=>BBBBBBBBB
    71. B释放锁完毕
    72. B进来了~~~~
    73. C=>CCCCCCC
    74. C释放锁完毕
    75. C进来了~~~~
    76. A=>AAAAAAA
    77. A释放锁完毕
    78. A进来了~~~~
    79. B=>BBBBBBBBB
    80. B释放锁完毕
    81. B进来了~~~~
    82. C=>CCCCCCC
    83. C释放锁完毕
    84. C进来了~~~~
    85. A=>AAAAAAA
    86. A释放锁完毕
    87. B=>BBBBBBBBB
    88. B释放锁完毕
    89. C=>CCCCCCC
    90. C释放锁完毕