博客
关于我
四. 精确通知顺序访问
阅读量:278 次
发布时间:2019-03-01

本文共 3144 字,大约阅读时间需要 10 分钟。

在学习Java多线程编程时,资源共享和多线程安全是非常重要的内容。为了更好地理解,我设计了一个多线程程序,按照顺序启动三个线程AA、BB、CC,它们分别打印5次、10次和15次字符。这个程序需要确保线程之间的资源共享是安全且有序的。

1. 多线程资源共享的实现

为了实现线程间的资源共享,我使用了ReentrantLock和Condition类。ReentrantLock允许同一线程多次获取锁,其他线程需要等待。而Condition则用于线程间的通知和等待,确保线程能够有序地执行任务。

2. 线程操作方法的设计

我为每个线程设计了一个操作方法,分别是print5、print10和print15。每个方法都在获取锁后检查当前的状态,确保线程能够安全地执行任务。

AA线程(print5方法)

  • 打印5次字符,更新状态到2,通知BB线程开始执行。

BB线程(print10方法)

  • 打印10次字符,更新状态到3,通知CC线程开始执行。

CC线程(print15方法)

  • 打印15次字符,更新状态到1,通知AA线程再次执行。

3. 代码实现

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class ShareResource {    private int number = 1; // 1:A, 2:B, 3:C    private Lock lock = new ReentrantLock();    private Condition condition1 = lock.newCondition();    private Condition condition2 = lock.newCondition();    private Condition condition3 = lock.newCondition();    public void print5() {        lock.lock();        try {            while (number != 1) {                condition1.await();            }            for (int i = 0; i < 5; i++) {                System.out.println(Thread.currentThread().getName() + "\tA");            }            number = 2;            condition2.signal();        } catch (Exception e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void print10() {        lock.lock();        try {            while (number != 2) {                condition2.await();            }            for (int i = 0; i < 10; i++) {                System.out.println(Thread.currentThread().getName() + "\tB");            }            number = 3;            condition3.signal();        } catch (Exception e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void print15() {        lock.lock();        try {            while (number != 3) {                condition3.await();            }            for (int i = 0; i < 15; i++) {                System.out.println(Thread.currentThread().getName() + "\tC");            }            number = 1;            condition1.signal();        } catch (Exception e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}public class ThreadOrderAccess {    public static void main(String[] args) {        ShareResource shareResource = new ShareResource();        new Thread(() -> {            for (int i = 0; i < 10; i++) {                shareResource.print5();            }        }, "thread1").start();        new Thread(() -> {            for (int i = 0; i < 10; i++) {                shareResource.print10();            }        }, "thread2").start();        new Thread(() -> {            for (int i = 0; i < 10; i++) {                shareResource.print15();            }        }, "thread3").start();    }}

4. 代码解释

  • 资源共享:使用ReentrantLock和Condition确保线程间的资源共享是安全的。
  • 线程等待与通知:通过while循环确保线程只能在特定状态下获取资源,避免虚假唤醒。
  • 状态管理:通过number变量跟踪当前状态,确保线程按照正确的顺序执行任务。
  • 线程启动:在main方法中启动三个线程,分别执行print5、print10和print15方法。

5. 测试与验证

为了确保程序的正确性,可以运行代码观察输出结果。预期输出应该是:

thread1	A	5次thread2	B	10次thread3	C	15次thread1	A	5次thread2	B	10次thread3	C	15次

通过观察输出,可以确认线程按照预期的顺序执行任务。

转载地址:http://ajco.baihongyu.com/

你可能感兴趣的文章
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校危化品管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校校园线上跳蚤市场的系统设计(程序+开题+论文)
查看>>