zoukankan      html  css  js  c++  java
  • java基础-多线程互斥锁

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

     
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.ReentrantLock;
    public class Demo3_ReentrantLock {
     /**
      * @param args
      */
     public static void main(String[] args) {
      final Printer3 p = new Printer3();
      
      new Thread() {
       public void run() {
        while(true) {
         try {
          p.print1();
         } catch (InterruptedException e) {
          
          e.printStackTrace();
         }
        }
       }
      }.start();
      
      new Thread() {
       public void run() {
        while(true) {
         try {
          p.print2();
         } catch (InterruptedException e) {
          
          e.printStackTrace();
         }
        }
       }
      }.start();
      
      new Thread() {
       public void run() {
        while(true) {
         try {
          p.print3();
         } catch (InterruptedException e) {
          
          e.printStackTrace();
         }
        }
       }
      }.start();
     }
    }
    class Printer3 {
     private ReentrantLock r = new ReentrantLock();
     private Condition c1 = r.newCondition();
     private Condition c2 = r.newCondition();
     private Condition c3 = r.newCondition();
     
     private int flag = 1;
     public void print1() throws InterruptedException {       
      r.lock();        //获取锁
       if(flag != 1) {
        c1.await();
       }
       System.out.print("黑");
       System.out.print("马");
       System.out.print("程");
       System.out.print("序");
       System.out.print("员");
       System.out.print(" ");
       flag = 2;
       //this.notify();      //随机唤醒单个等待的线程
       c2.signal();
      r.unlock();        //释放锁
     }
     
     public void print2() throws InterruptedException {
      r.lock();
       if(flag != 2) {
        c2.await();
       }
       System.out.print("传");
       System.out.print("智");
       System.out.print("播");
       System.out.print("客");
       System.out.print(" ");
       flag = 3;
       //this.notify();
       c3.signal();
      r.unlock();
     }
     
     public void print3() throws InterruptedException {
      r.lock();
       if(flag != 3) {
        c3.await();
       }
       System.out.print("i");
       System.out.print("t");
       System.out.print("h");
       System.out.print("e");
       System.out.print("i");
       System.out.print("m");
       System.out.print("a");
       System.out.print(" ");
       flag = 1;
       c1.signal();
      r.unlock();
     }
    }
     
  • 相关阅读:
    [打印管理器]读取样式列表失败:Invalid variant operation
    分销产品安装在Win7系统上,日期格式错误的解决方案
    如何查看IIS与MSSQL数据库连接池
    分销研发部博客园正式开通了,欢迎大家关注
    asp.net Application_start()方法无法命中断点
    程序健壮性之“异常处理”
    解决问题--在Excel中使用条码字体打印出的code128条码不能被识别
    程序中的数据精度处理问题
    Spring.NET 学习笔记
    ASP.Net MVC开发基础学习笔记(1):走向MVC模式
  • 原文地址:https://www.cnblogs.com/wuxu/p/10727668.html
Copyright © 2011-2022 走看看