zoukankan      html  css  js  c++  java
  • 重入锁示例

    package com.viewhigh.mdop.bi.test;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import static org.junit.Assert.*;
    
    /**
     * Created by zzq on 2017/5/11.
     */
    public class MasterTest {
       
        @Test
        public void submitTask1() throws Exception {//6  7runnable没有参与Condition,执行位置不确定
            final Lock lock = new ReentrantLock();//重入锁
            Condition c1 = lock.newCondition();
            Condition c2 = lock.newCondition();
            Condition c3 = lock.newCondition();
            Runnable runnable0 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("0开始执行---");
                        System.out.println("0开始等待---");
                        c1.await();//相当于 Object与synchronized  的wait
                        System.out.println("0已经被唤醒---");
                        Thread.sleep(2000);
                        System.out.println("0执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
            Runnable runnable1 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("1开始执行---");
                        System.out.println("1开始等待---");
                        c1.await();//相当于 Object与synchronized  的wait
                        System.out.println("1已经被唤醒---");
                        Thread.sleep(2000);
                        System.out.println("1执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
            Runnable runnable2 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("2开始执行---");
                        System.out.println("2开始等待---");
                        c2.await();
                        Thread.sleep(2000);
                        c1.signalAll();//相当于 所有的Thread中已经添加await的全部notify操作了,不带有all的仅仅唤醒第一个。而且 要等到所有线程全部正常执行后才会唤醒设置了await的线程
    
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
    
            Runnable runnable3 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("3开始执行---");
                        System.out.println("3开始等待---");
                        c2.await();
                        Thread.sleep(2000);
                        System.out.println("3执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
    
    
            Runnable runnable4 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("4开始执行---");
                        System.out.println("4开始等待---");
                        c3.await();
                        c2.signalAll();
                        System.out.println("2执行结束,要等3执行结束后(3也是使用了c2的Condition的await),才唤醒r0和r1---");
                        Thread.sleep(2000);
                        System.out.println("4执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
    
    
            Runnable runnable5 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("5开始执行---");
                        System.out.println("4将要被唤醒---");
                        c3.signal();//唤醒4线程
                        Thread.sleep(2000);
                        System.out.println("5执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
            Runnable runnable6 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("6开始执行---");
                        Thread.sleep(2000);
                        System.out.println("6执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
            Runnable runnable7 = new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.lock();
                        System.out.println("7开始执行---");
                        Thread.sleep(2000);
                        System.out.println("7执行结束---");
                    } catch (Exception e) {
    
                    } finally {
                        lock.unlock();
                    }
                }
            };
    
            Thread t0 = new Thread(runnable0);
            t0.start();
            Thread t1 = new Thread(runnable1);
            t1.start();
            Thread t2 = new Thread(runnable2);
            t2.start();
            Thread t3 = new Thread(runnable3);
            t3.start();
            Thread t4 = new Thread(runnable4);
            t4.start();
            Thread t5 = new Thread(runnable5);
            t5.start();
            Thread t6 = new Thread(runnable6);
            t6.start();
            Thread t7 = new Thread(runnable7);
            t7.start();
            while (t7.getState() != Thread.State.TERMINATED || t6.getState() != Thread.State.TERMINATED || t5.getState() != Thread.State.TERMINATED || t4.getState() != Thread.State.TERMINATED || t0.getState() != Thread.State.TERMINATED || t1.getState() != Thread.State.TERMINATED || t2.getState() != Thread.State.TERMINATED || t3.getState() != Thread.State.TERMINATED) {
    
            }
    
            System.out.println("全部结束---");
        }
    }
  • 相关阅读:
    oracle inside(5)
    oracle inside(4)
    WF & WCF(1)
    oracle inside(7)
    oracle inside(11)
    ArrayList使用toArray()构造数组时的问题
    在android下抓包
    为什么中国的程序员技术偏低
    [置顶] 女人与程序的对应关系!
    Java synchronized详解
  • 原文地址:https://www.cnblogs.com/zzq-include/p/6851768.html
Copyright © 2011-2022 走看看