`

Java多线程之多条件condition接口及其相关类的使用举例

 
阅读更多

package testthread;

 

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/*

 * 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,

 * 要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

 * 

 * 使用condition接口、lock类、ReentrantLock类实现线程的通信

 * 

 */

public class TestLock {

public static void main(String[] args) {

         final AlternateDemo ad = new AlternateDemo(); //在使用Java局部内部类或者匿名内部类时,若该类调用了所在方法的局部变量,则该局部变量必须使用final关键字来修饰,否则将会出现编译错误“Cannot refer to a non-final variable * inside an inner class defined in a different method”

 

        new Thread(new Runnable() {

            @Override

            public void run() {

                for (int i = 0; i < 10; i++) {

                    ad.loopA();

                }

            }

        }, "A").start();

 

        new Thread(new Runnable() {

            @Override

            public void run() {

                for (int i = 0; i < 10; i++) {

                    ad.loopB();

                }

            }

        }, "B").start();

 

        new Thread(new Runnable() {

            @Override

            public void run() {

 

                for (int i = 0; i < 10; i++) {

                    ad.loopC();

                    System.out.println("-----------------------------------");

                }

            }

        }, "C").start();

    }

 

}

 

class AlternateDemo {

 

    private int number = 1; //当前正在执行线程的标记

 

    private Lock lock = new ReentrantLock();

    private Condition condition1 = lock.newCondition();

    private Condition condition2 = lock.newCondition();

    private Condition condition3 = lock.newCondition();

 

    public void loopA() {

        lock.lock();//类比去银行办理业务,此行代码相当于先拿到一个办理业务的排队号码

        try {

            //1. 判断

            if (number != 1) {

                condition1.await();//线程等待之后,该线程中的其它代码都不会被执行,就直接退出了

            }

            //2. 打印

            System.out.println(Thread.currentThread().getName());

            //3. 唤醒

            number = 2;

            condition2.signal();//尝试去唤醒一个其它等待的满足条件的线程,每个线程都会拿到一次锁,若条件满足将会执行该线程,否则将会等待

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

    public void loopB() {

        lock.lock();

        try {

            //1. 判断

            if (number != 2) {

                condition2.await();//等待之后将会释放锁

            }

            //2. 打印

            System.out.println(Thread.currentThread().getName());

            //3. 唤醒

            number = 3;

            condition3.signal();

            //condition3.toString();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

    public void loopC() {

        lock.lock();

        try {

            //1. 判断

            if (number != 3) {

                condition3.await();

            }

            //2. 打印

            System.out.println(Thread.currentThread().getName());

            //3. 唤醒

            number = 1;

            condition1.signal();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

}

 

分享到:
评论

相关推荐

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南...本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。

    java 多线程

    java 多线程 知识相关,主要是介绍 java 多线程相关的知识

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java多线程练习题

    这是对Java多线程的一些相关练习题 包括选择 填空 简答 编程等题型

    Java多线程编程指南

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 ...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    Java 高并发编程相关知识, 接下来将阅读该书, 并且进行比较详细的总结, 好记性不如烂笔头, 加油。 Java 多线程编程实战指南。

    java多线程编程实战指南 核心篇 代码

    随着现代处理器的生产工艺从提升...《Java多线程编程实战指南(核心篇)》适合有一定Java语言基础的读者作为入门多线程编程之用,也适合有一定多线程编程经验的读者作为重新梳理知识结构以提升认知层次和参考之用。

    《Java多线程设计模式》附源码中文教程 (PDF)

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中在代码的重要部分加上标注使读者更加容易...

    Java多线程-多线程相关概念

    Java多线程--多线程相关概念

    java多线程设计模式详解(PDF及源码)

    单线程程序 多线程程序 Thread类的run方法和start方法 线程的启动 线程的启动(1)——利用Thread类的子类 线程的启动(2)——利用Runnable接口 线程的暂时停止 线程的共享互斥 synchronized方法 synchronized阻挡 ...

    java多线程编程_java多线程_

    1.讲解了Java多线程的基础, 包括Thread类的核心API的使用。2.讲解了在多线程中对并发访问的控制, 主要就是synchronized的使用, 由于此关键字在使用上非常灵活, 所以书中用了很多案例来介绍此关键字的使用, 为...

    多线程系列相关的技术要点

    1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized...7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八)线程池与Executor 框架

    java多线程设计模式及源码

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...

    Java 利用多线程实现文件的分片下载

    Main方法是运行开始的方法,里面StopWatch是测速工具类,如果要想使用请导入相关maven坐标,不想使用直接删除即可。 内容概要: 这是随手写的一个利用线程池下载文件的小玩具,如果刚学完线程池不知道怎么使用的,...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字和示例来介绍与java线程相关的设计模式理念

    JAVA多线程设计模式_中国铁道出版社_源码

    JAVA多线程设计模式_中国铁道出版社 本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计...

    Java多线程思维导图

    Java的思维导图模型,自己上课和下课的总结,不喜勿喷

Global site tag (gtag.js) - Google Analytics