zoukankan      html  css  js  c++  java
  • 线程轮循打印ABC...

      1 package com.java.concurrent;
      2 
      3 import java.util.concurrent.locks.Condition;
      4 import java.util.concurrent.locks.Lock;
      5 import java.util.concurrent.locks.ReentrantLock;
      6 
      7 /**
      8  * 使用多线程的方式进行轮循打印ABCABC
      9  * @author fliay
     10  *
     11  */
     12 public class TestABCAlternate {
     13 
     14     public static void main(String[] args) {
     15         final AlternateDemo ad = new AlternateDemo();
     16         new Thread(new Runnable() {
     17             
     18             public void run() {
     19                 for(int i = 1;i<10;i++){
     20                     try {
     21                         ad.loopA(i);
     22                     } catch (InterruptedException e) {
     23                         // TODO Auto-generated catch block
     24                         e.printStackTrace();
     25                     }
     26                 }
     27             }
     28         },"线程1").start();
     29         
     30     new Thread(new Runnable() {
     31             
     32             public void run() {
     33                 for(int i = 1;i<10;i++){
     34                     try {
     35                         ad.loopB(i);
     36                     } catch (InterruptedException e) {
     37                         // TODO Auto-generated catch block
     38                         e.printStackTrace();
     39                     }
     40                 }
     41             }
     42         },"线程2").start();
     43     
     44     
     45     new Thread(new Runnable() {
     46         
     47         public void run() {
     48             for(int i = 1;i<10;i++){
     49                 try {
     50                     ad.loopC(i);
     51                 } catch (InterruptedException e) {
     52                     // TODO Auto-generated catch block
     53                     e.printStackTrace();
     54                 }
     55             }
     56         }
     57     },"线程3").start();
     58     
     59     
     60     
     61     }
     62 
     63     
     64 
     65 }
     66 
     67 
     68 class AlternateDemo{
     69     
     70     private int number=1;//当前正在执行的线程标记
     71     
     72     private Lock lock = new ReentrantLock();
     73     
     74     private Condition condition1 = lock.newCondition();
     75     private Condition condition2 = lock.newCondition();
     76     private Condition condition3 = lock.newCondition();
     77     
     78     public void loopA(int totalLoop) throws InterruptedException{
     79         lock.lock();
     80         try{
     81             //1.判断
     82             if(number!=1){
     83                 condition1.await();
     84             }
     85             //2.打印
     86             System.out.println(Thread.currentThread().getName()+":A"+"-"+totalLoop);
     87             
     88             //3.唤醒
     89             number=2;
     90             condition2.signal();
     91         }finally{
     92             lock.unlock();
     93         }
     94     }
     95     
     96     public void loopB(int totalLoop) throws InterruptedException{
     97         lock.lock();
     98         try{
     99             //1.判断
    100             if(number!=2){
    101                 condition2.await();
    102             }
    103             //2.打印
    104             System.out.println(Thread.currentThread().getName()+":B"+"-"+totalLoop);
    105             
    106             //3.唤醒
    107             number=3;
    108             condition3.signal();
    109         }finally{
    110             lock.unlock();
    111         }
    112     }
    113     
    114     
    115     public void loopC(int totalLoop) throws InterruptedException{
    116         lock.lock();
    117         try{
    118             //1.判断
    119             if(number!=3){
    120                 condition3.await();
    121             }
    122             //2.打印
    123             System.out.println(Thread.currentThread().getName()+":C"+"-"+totalLoop);
    124             
    125             //3.唤醒
    126             number=1;
    127             condition1.signal();
    128         }finally{
    129             lock.unlock();
    130         }
    131     }
    132     
    133     
    134     
    135     
    136     
    137     
    138     
    139     
    140     
    141     
    142     
    143     
    144 }
  • 相关阅读:
    create mysql database
    mysql install
    mac os vim 乱码
    Three.js 基础入门
    Echarts修改提示框及自定义提示框内容
    Echarts3实例 南丁格尔饼图
    南丁格尔玫瑰图3
    Echarts实战案例代码:饼图pie之南丁格尔玫瑰图rose实现代码
    记录下vue 中引用echarts 出现 "TypeError: Cannot read property 'getAttribute' of undefined"问题
    echarts 中国地图,根据省份数值高低改变省份颜色深浅
  • 原文地址:https://www.cnblogs.com/fliay/p/7680746.html
Copyright © 2011-2022 走看看