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();
     }
    }
     
  • 相关阅读:
    Linux下Zookeeper安装使用
    Dubbo的@Reference和@Service说明
    java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener异常解决
    Java 开发常用工具
    Vue自动化路由(基于Vue-Router)开篇
    HTML5 开发APP( 支付宝支付)
    关于微信网页缓存的问题
    小程序(仿微信发布说说功能)
    移动端九宫格抽奖源码
    H5 + 开发App(分享功能)
  • 原文地址:https://www.cnblogs.com/wuxu/p/10727668.html
Copyright © 2011-2022 走看看