`

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中,可以通过继承`Thread`类或者实现`Runnable`接口来创建线程。 ##### 3. 多线程分页查询方案设计 针对数据量较大的场景,本文介绍的多线程分页查询方案主要包含以下几个步骤: - **步骤1:计算总记录数**...

    Java 多线程 PPT

    本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...

    java多线程的使用和介绍

    ### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。每个线程都是一个轻量级的进程,可以在单个程序中独立运行,共享该程序的资源。在Java中,多线程是通过`java.lang....

    Java多线程编辑核心技术

    此外,Java中的java.util.concurrent.locks.Condition接口提供了条件变量的实现,可以用来控制线程之间的协作。 除了上述核心概念和工具类,Java 5.0引入了并发工具类如CountDownLatch、CyclicBarrier、Semaphore等...

    现代多线程 JAVA和c++多线程实现 测试和调试

    在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程。`Thread`类提供了线程的启动、同步和控制方法,如`start()`、`join()`和`...

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

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

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

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

    java弹球小游戏,多线程

    下面将详细探讨Java多线程在弹球游戏中如何应用以及相关知识点。 首先,我们要理解Java中的线程。线程是程序执行的最小单位,一个进程可以有多个线程。在Java中,可以通过继承Thread类或实现Runnable接口来创建线程...

    Java实现的两个线程同时运行案例

    在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及Java多线程相关操作与使用技巧。 Java多线程编程的优点包括: 1. 提高程序的执行效率:多线程编程可以将复杂的任务分解成多个小任务,每个任务...

    Java多线程技术

    在Java中,多线程的实现主要有两种方式:一种是继承Thread类,另一种是实现Runnable接口。然而,多线程的使用同时也引入了线程安全问题,需要程序员注意同步控制和数据一致性。 在讨论Java多线程技术时,首先需要...

    Java多线程断点下载 带源码

    在Java中,我们可以使用`java.net.URLConnection`类来获取文件的相关信息,如文件的总长度。通过`URLConnection.connect()`方法建立连接,然后调用`getContentLengthLong()`来获取文件的大小。这有助于确定文件需要...

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

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

    Java多线程编程实战指南(设计模式篇)

    Java提供了丰富的API,如`Thread`类、`Runnable`接口以及`ExecutorService`等,来支持多线程的创建和管理。本书将深入讲解这些核心概念,包括线程的生命周期、同步机制、线程池的使用,以及如何避免常见的并发问题,...

    Java多线程相关知识总结

    ### Java多线程相关知识总结 #### 一、基本概念 多线程是现代编程语言中一项非常重要的特性,尤其在Java这样的高级语言中更是如此。简单来说,**多线程**指的是在一个程序中能够同时运行多个不同的执行路径。下面...

    java多线程介绍

    本文将深入探讨 Java 中的多线程相关知识,包括线程的创建、同步机制以及 `wait`、`notify` 和 `notifyAll` 方法的使用。 首先,线程的创建在 Java 中主要通过两种方式:一是继承 `Thread` 类,二是实现 `Runnable`...

    java多线程设计模式

    - **线程同步**:为了解决多个线程对共享资源的并发访问问题,Java提供了`synchronized`关键字、`Lock`接口以及相关的工具类,如`ReentrantLock`。 2. **设计模式** - **生产者消费者模式**:使用`BlockingQueue`...

    java多线程使用教程

    在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。下面将深入探讨这两个方法以及相关的知识点。 1. 继承Thread类 当一个类继承了Thread类,它就成为一个线程类。通过重写Thread类的`run()`...

    Java多线程面试知识点解析

    内容概要:本文汇总了有关Java多线程方面的28个面试题目及其详细解答,涵盖了线程的基础概念、线程创建方法、线程控制(启动、同步、休眠、停止)、高级特性和应用技巧(线程局部存储、线程池、同步器等)。...

    java+多线程+同步详解源码整理

    实现`Runnable`接口更为灵活,因为Java不支持多重继承,而一个类可以实现多个接口。 2. **线程的生命周期** 线程有五种状态:新建、就绪、运行、阻塞和死亡。Java的`Thread`类提供了控制线程的方法,如`start()`...

    java多线程demo

    总之,这个"java多线程demo"项目提供了全面的多线程编程实践,涵盖了基础的线程创建、线程同步、线程池以及高级的并发工具类的使用。通过分析和运行这些示例,开发者可以深入理解和掌握Java的多线程特性,提升并发...

Global site tag (gtag.js) - Google Analytics