zoukankan      html  css  js  c++  java
  • 13.Java5条件阻塞Condition的应用

     1 import java.util.concurrent.locks.Condition;
     2 import java.util.concurrent.locks.Lock;
     3 import java.util.concurrent.locks.ReentrantLock;
     4 
     5 /**
     6  * Java5条件阻塞Condition的应用
     7  * Condition的功能类似在传统线程技术中的Object.wait()和Object.notify()功能。
     8  * 在等待Condition时,允许发生“虚假唤醒”,这通常作为基础平台语义的让步。对于大多数应用程序,
     9  * 这带来的实际影响很小,因为Condition应该总是在一个循环中被等待,并测试正被等待的状态声明。
    10  * 某个实现可以随意溢出可能的虚假唤醒,但建议应用程序员总是假定这些虚假唤醒可能发生,因此总是在一个循环中等待。
    11  * 
    12  * 一个锁内部可以有多个Condition,即有多个
    13  * 
    14  * Condition是基于Lock之上的
    15  * @author LiTaiQing
    16  *
    17  */
    18 public class ConditionCommunication {
    19 
    20     public static void main(String[] args) {
    21         final Business business = new Business();
    22         new Thread(new Runnable() {
    23             @Override
    24             public void run() {
    25                 for (int i = 1; i <= 50; i++) {
    26                     business.sub(i);
    27                 }
    28 
    29             }
    30         }).start();
    31 
    32         for (int i = 1; i <= 50; i++) {
    33             business.main(i);
    34         }
    35 
    36     }
    37 
    38     static class Business {
    39         Lock lock = new ReentrantLock();
    40         Condition condition = lock.newCondition();
    41         private boolean bShouldSub = true;
    42 
    43         public void sub(int i) {
    44             lock.lock();
    45             try {
    46                 while (!bShouldSub) {
    47                     try {
    48                         condition.await();
    49                     } catch (Exception e) {
    50                         e.printStackTrace();
    51                     }
    52                 }
    53                 for (int j = 1; j <= 10; j++) {
    54                     System.out.println("sub thread sequence of " + j
    55                             + ",loop of " + i);
    56                 }
    57                 bShouldSub = false;
    58                 condition.signal();
    59             } finally {
    60                 lock.unlock();
    61             }
    62         }
    63 
    64         public void main(int i) {
    65             lock.lock();
    66             try {
    67                 while (bShouldSub) {
    68                     try {
    69                         condition.await();
    70                     } catch (Exception e) {
    71                         e.printStackTrace();
    72                     }
    73                 }
    74                 for (int j = 1; j <= 100; j++) {
    75                     System.out.println("main thread sequence of " + j
    76                             + ",loop of " + i);
    77                 }
    78                 bShouldSub = true;
    79                 condition.signal();
    80             } finally {
    81                 lock.unlock();
    82             }
    83         }
    84     }
    85 }
      1 import java.util.concurrent.locks.Condition;
      2 import java.util.concurrent.locks.Lock;
      3 import java.util.concurrent.locks.ReentrantLock;
      4 
      5 public class ThreeConditionCommunication {
      6     public static void main(String[] args) {
      7         final Business business = new Business();
      8         new Thread(new Runnable() {
      9             @Override
     10             public void run() {
     11                 for (int i = 1; i <= 50; i++) {
     12                     business.sub2(i);
     13                 }
     14 
     15             }
     16         }).start();
     17         new Thread(new Runnable() {
     18             @Override
     19             public void run() {
     20                 for (int i = 1; i <= 50; i++) {
     21                     business.sub3(i);
     22                 }
     23 
     24             }
     25         }).start();
     26         for (int i = 1; i <= 50; i++) {
     27             business.main(i);
     28         }
     29 
     30     }
     31 
     32     static class Business {
     33         Lock lock = new ReentrantLock();
     34         Condition condition1 = lock.newCondition();
     35         Condition condition2 = lock.newCondition();
     36         Condition condition3 = lock.newCondition();
     37         private int shouldSub = 1;
     38         public void sub2(int i) {
     39             lock.lock();
     40             try {
     41                 while (shouldSub != 2) {
     42                     try {
     43                         condition2.await();
     44                     } catch (Exception e) {
     45                         e.printStackTrace();
     46                     }
     47                 }
     48                 for (int j = 1; j <= 10; j++) {
     49                     System.out.println("sub2 thread sequence of " + j
     50                             + ",loop of " + i);
     51                 }
     52                 shouldSub = 3;
     53                 condition3.signal();
     54             } finally {
     55                 lock.unlock();
     56             }
     57         }
     58 
     59         public void sub3(int i) {
     60             lock.lock();
     61             try {
     62                 while (shouldSub != 3) {
     63                     try {
     64                         condition3.await();
     65                     } catch (Exception e) {
     66                         e.printStackTrace();
     67                     }
     68                 }
     69                 for (int j = 1; j <= 20; j++) {
     70                     System.out.println("sub3 thread sequence of " + j
     71                             + ",loop of " + i);
     72                 }
     73                 shouldSub = 1;
     74                 condition1.signal();
     75             } finally {
     76                 lock.unlock();
     77             }
     78         }
     79 
     80         public void main(int i) {
     81             lock.lock();
     82             try {
     83                 while (shouldSub != 1) {
     84                     try {
     85                         condition1.await();
     86                     } catch (Exception e) {
     87                         e.printStackTrace();
     88                     }
     89                 }
     90                 for (int j = 1; j <= 100; j++) {
     91                     System.out.println("main thread sequence of " + j
     92                             + ",loop of " + i);
     93                 }
     94                 shouldSub = 2;
     95                 condition2.signal();
     96             } finally {
     97                 lock.unlock();
     98             }
     99         }
    100 
    101     }
    102 }
  • 相关阅读:
    datasnap 2010 为DataSnap系统服务程序添加描述
    uLanguage.pas
    cxgrid上如何取FOOTER上合计的值
    cxgrid经典用法
    datasnap 2010 DataSnap服务端和客户端发布分发方法
    php_network_getaddresses: getaddrinfo failed 原因
    查看crontab运行状态
    laravel 开启定时任务需要操作
    解决cron不执行的问题
    UPdate语句
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4649774.html
Copyright © 2011-2022 走看看