重入锁示例

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("全部结束---");
    }
}
原文地址:https://www.cnblogs.com/zzq-include/p/6851768.html