zoukankan      html  css  js  c++  java
  • 025 Condition条件

    一 . 概述

      在之前我们我们线程之间进行通信使用的是内置锁的wait()方法和notify()实现的,而我们使用了高级锁之后,就可以使用Condition进行条件控制,

        通过精确的控制我们能够完成更简单的线程控制.


     二 .Condition的使用

      下面我们定义三个线程,让他们按照次序进行输出. 

    public class ConditionTest {
    
        public void testA() {
            System.out.println("aaaa");
        }
    
        public void testB() {
            System.out.println("bbbbb");
        }
    
        public void testC() {
            System.out.println("ccccc");
        }
    
        private static Lock lock = new ReentrantLock();
        private static Condition c1 = lock.newCondition();
        private static Condition c2 = lock.newCondition();
        private static Condition c3 = lock.newCondition();
        private static volatile Integer count = new Integer(0);
    
        public static void main(String[] args) {
            ConditionTest demo = new ConditionTest();
            new Thread(() -> {
                while (true) {
                    lock.lock();
                    try {
                        if (count % 3 == 0) {
                            // 允许进入
                            demo.testA();
                            // 唤醒B线程
                            c2.signal();
                            count++;
                            // 自己睡眠
                            try {
                                c1.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    } finally {
                        lock.unlock();
                    }
                }
            }).start();
    
            new Thread(() -> {
                while (true) {
                    lock.lock();
                    try {
                        if (count % 3 == 1) {
                            // 允许进入
                            demo.testB();
                            // 唤醒B线程
                            c3.signal();
                            count++;
                            // 自己睡眠
                            try {
                                c2.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    } finally {
                        lock.unlock();
                    }
                }
            }).start();
            new Thread(() -> {
                while (true) {
                    lock.lock();
                    try {
                        if (count % 3 == 2) {
                            // 允许进入
                            demo.testC();
                            // 唤醒B线程
                            c1.signal();
                            count++;
                            // 自己睡眠
                            try {
                                c3.await();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    } finally {
                        lock.unlock();
                    }
                }
            }).start();
        }
    }

      我们发现使用Condition和之前使用内置锁没有什么区别.


    三 总结

      我们在使用Lock的时候可以使用Condition完成线程之间的通信,通过这中通信的方式可以完成对线程的精确控制.

      其中await()方法表示释放条件对象,然后该线程进入到等待队列之中,与wait()方法是十分相似的.

      同时我们可以看到,通过使用条件对象,我们对线程的控制更加简单,使用之前的内置锁就不意见容易的事情.

  • 相关阅读:
    ansible for devops 读书笔记第二章Ad-Hoc Commands
    ansible for devops读书笔记第一章
    python3 获取天气
    简单cpu web flask mysql
    mysql mysqldump只导出表结构或只导出数据的实现方法
    nginx 限制solr
    [Selenium] 如何使 InternetExplorerDriver 每次启动的端口不会随机变化
    [Selenium] 如何绕过 IE 的安全模式
    [Selenium] close alert window
    [Selenium] waitUntilAllAjaxRequestCompletes
  • 原文地址:https://www.cnblogs.com/trekxu/p/9010519.html
Copyright © 2011-2022 走看看