1. package org.example.concurrency.test;
    2. import lombok.extern.slf4j.Slf4j;
    3. import java.util.concurrent.TimeUnit;
    4. import java.util.concurrent.locks.Condition;
    5. import java.util.concurrent.locks.ReentrantLock;
    6. /**
    7. * @author huskyui
    8. */
    9. @Slf4j
    10. public class Test27 {
    11. static ReentrantLock ROOM = new ReentrantLock();
    12. static boolean hasCigarette = false;
    13. static boolean hasTakeout = false;
    14. static Condition waitCigarette = ROOM.newCondition();
    15. static Condition waitTakeout = ROOM.newCondition();
    16. public static void main(String[] args) {
    17. new Thread(()->{
    18. ROOM.lock();
    19. try {
    20. while (!hasCigarette) {
    21. try {
    22. waitCigarette.await();
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. log.debug("有烟没{}",hasCigarette);
    28. if (hasCigarette){
    29. log.debug("有烟干活");
    30. }else{
    31. log.debug("没烟不干活");
    32. }
    33. }finally {
    34. ROOM.unlock();
    35. }
    36. }).start();
    37. new Thread(()->{
    38. ROOM.lock();
    39. try{
    40. while (!hasTakeout){
    41. try {
    42. waitTakeout.await();
    43. } catch (InterruptedException e) {
    44. e.printStackTrace();
    45. }
    46. }
    47. log.debug("有外卖没{}",hasTakeout);
    48. if (hasTakeout){
    49. log.debug("有外卖干活");
    50. }else{
    51. log.debug("没有外卖,不干活");
    52. }
    53. }finally {
    54. ROOM.unlock();
    55. }
    56. }).start();
    57. try {
    58. TimeUnit.SECONDS.sleep(2);
    59. } catch (InterruptedException e) {
    60. e.printStackTrace();
    61. }
    62. new Thread(()->{
    63. ROOM.lock();
    64. try {
    65. hasTakeout = true;
    66. waitTakeout.signal();
    67. }finally {
    68. ROOM.unlock();
    69. }
    70. }).start();
    71. new Thread(()->{
    72. ROOM.lock();
    73. try {
    74. hasCigarette = true;
    75. waitCigarette.signal();
    76. }finally {
    77. ROOM.unlock();
    78. }
    79. }).start();
    80. }
    81. }