A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

多线程(JDK1.5的新特性互斥锁)
1.同步
        * 使用ReentrantLock类的lock()和unlock()方法进行同步
2.通信
        * 使用ReentrantLock类的newCondition()方法可以获取Condition对象
        * 需要等待的时候使用Condition的await()方法, 唤醒的时候用signal()方法
        * 不同的线程使用不同的Condition, 这样就能区分唤醒的时候找哪个线程了
  1. package cn.itcast.singleton;

  2. import java.util.Date;
  3. import java.util.concurrent.TimeUnit;
  4. import java.util.concurrent.locks.Condition;
  5. import java.util.concurrent.locks.ReentrantLock;

  6. public class ReentrantLockDemo {

  7.         /**
  8.          * @param args
  9.          */
  10. public static void main(String[] args) {
  11.         final Printer03 p=new Printer03();               
  12.        
  13.         new Thread(){                //创建线程
  14.                 public void run()
  15.                 {
  16.                         while(true)
  17.                         {try {
  18.                                 p.print1();
  19.                         } catch (InterruptedException e) {
  20.                                
  21.                                 e.printStackTrace();
  22.                         }}
  23.                 };
  24.         }.start();                //开启线程
  25.        
  26.         new Thread(){
  27.                 public void run()
  28.                 {
  29.                         while(true)
  30.                         {try {
  31.                                 p.print2();
  32.                         } catch (InterruptedException e) {
  33.                                
  34.                                 e.printStackTrace();
  35.                         }}
  36.                 };
  37.         }.start();
  38.         new Thread(){
  39.                 public void run()
  40.                 {
  41.                         while(true)
  42.                         {try {
  43.                                 p.print3();
  44.                         } catch (InterruptedException e) {
  45.                                
  46.                                 e.printStackTrace();
  47.                         }}
  48.                 };
  49.         }.start();               
  50. }
  51. }

  52. class Printer03{       
  53. ReentrantLock r =new ReentrantLock();        //创建线程锁
  54. private Condition c1 =r.newCondition();                //根据锁产生Condition对象  
  55. private Condition c2 =r.newCondition();
  56. private Condition c3 =r.newCondition();
  57.        
  58. private int flag=1;                        //定义一个变量作为线程等待的条件
  59. public  void print1() throws InterruptedException {               
  60.         r.lock();                //获得锁,线程锁定  
  61.                 if(flag!=1)
  62.                 {c1.await();}                //当flag!=1的时候线程等待
  63.                 System.out.println("黑");
  64.                 System.out.println("黑");
  65.                 System.out.println("黑");
  66.                 System.out.println("黑");
  67.                 System.out.println("黑");
  68.                 flag=2;
  69.                 c2.signal();        //当flag=2的时候唤醒线程c2
  70.         r.unlock();                        //解除锁定
  71. }
  72.        
  73. public void print2() throws InterruptedException {
  74.         r.lock();                       
  75.                 if(flag!=2)
  76.                 {c2.await();}
  77.                 System.out.println("白");
  78.                 System.out.println("白");
  79.                 System.out.println("白");
  80.                 System.out.println("白");
  81.                 System.out.println("白");
  82.                 flag=3;
  83.                 c3.signal();
  84.                 r.unlock();
  85.         }               
  86.        
  87.         public void print3() throws InterruptedException {
  88.                 r.lock();                       
  89.                         if(flag!=3)
  90.                         {c3.await();}
  91.                         System.out.println("灰");
  92.                         System.out.println("灰");
  93.                         System.out.println("灰");
  94.                         System.out.println("灰");
  95.                         System.out.println("灰");
  96.                         flag=1;
  97.                         c1.signal();
  98.                         r.unlock();
  99. }
  100.        
  101. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马