教育路上

全国站>Java>多线程>java控制多个线程按照一定的顺序轮流执行
学员需求

java控制多个线程按照一定的顺序轮流执行

摘要:java控制多个线程按照一定的顺序轮流执行,此时需要让线程间进行通信。java 多线程 顺序 轮流 执行。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。

2022-05-19 14:01网络推荐

发布时间:
2022-05-19 14:01
信息来源:
网络推荐
浏览次数:
599
java控制多个线程按照一定的顺序轮流执行

如果想解决上述问题,就需要控制多个线程按照一定的顺序轮流执行,此时需要让线程

间进行通信。在 Object 类中提供了 wait( )、notify( )、notiyAll()方法用于解决线程间的通信

问题,由于 Java 中所有类都是 Objet 类的子类或间接子类,因此任何类的实例对象都可以直

接使用这些方法。接下来通过表 14-2 详细说明这几个方法的作用。

from shengerguan

表 14-2 中列出了 3 个与线程通信相关的方法,其中 wait( )方法用于使当前线程进入等待状

态,notify( )和 notifyAll( )方法用于唤醒当前处于等待状态的线程。需要注意的是,wait()、

notify()和 notifyAll )这三个方法的调用者都应该是同步锁对象,如果这三个方面法的调用者

不是同步锁对象,Java 虚拟机就会抛出 IllegalMonitorStateException 异常。

接下来通过使用 wait()和 notify()方法,对例 14-15 进行改写来实现线程间的通信,如例

14-18 所示。

例 14-18 Storage.java

class Storage {

private int [] cells=new int[10]; //数据存储数组

private int inPos,outPos; //inPos 存入时数组下标,outPos 取出时数组下标

private int count; //存入或者取出数据的数量

public synchronized void put(int num) {

try (

//如果放入数据等于 cells 的长度,此线程等待

while (count==cells.length) {

this.wait();

}

cells[inPos]=num; //向数组中放入数据

System.out.printin("在 cells["+inPos+"]中放人数据---"+cells[inPos]);-

inPos++; //存完元素让位置加 1

if (inPos==cells.length) //当在 cells[9]放完数据后再从 cells[0]开始

inPos=0;

count++ ; ////每放一个数据 count 加 1

this.notify();

}catch (Exception e)

e.printStackTrace() ;

}

}

public synchronized void get () {

try {

while (count==0) { //如果 count 为 0,此线程等待

this.wait();

}

int data=cells[outPos]; //从数组中取出数据

System.out.printIn(“从 cells["+outPos+]"中取出数据”+data);

cells[outPos]=0; //取出后,当前位置的数据置 0

outPos++ ; //取完元素让位置加 1

if (outPos==cells.length) //当从 cells[9]取完数据后再从 cells[0]开始

outPos=0;

count-- ; //每取出一个元素 count 被

this.notify();

}catch (Exception e) {

e.printStackTrace () ;

}

}

}

再次运行例 14-17 的测试程序,结果如图 14-20 所示。

from shengerguan

例 14-18 的 Storage 类是对例 14-15 的改写,首先通过使用 synchronized 关键将 put()方法和

get( )方法修饰为同步方法,之后每操作一次数据,便调用一次 notify()方法唤醒对应同步锁上

等待的线程。当存入数据时,如果 count 的值与 cells 数组的长度相同,说明数组已经添满,

此时就需要调用同步锁的 wait( )方法使存入数据的线程进入等待状态,同理,当取出数据时

如果 count 的值为 0,说明数组已被取空,此时就需要调用同步锁 wait()方法,使取出数据的

线程进入等待状态。从运行结果可以看出,存入数据和取出的数据都是依次递增的自然数。

上一篇:
java多线程通信
下一篇:
java聊天室综合案例
标签:
网友评论
发布评论

访客的评论 2024/04/20 14:26

文中描述的是准确的吗,如何报名!

相关推荐
我也来发表评价关闭
我对该内容的评价:
0
评价500
验证码: 看不清 换一张
提交 (匿名发布,无须担心别人知道您的身份)
学校免费发布信息关闭
我们审核后会尽快展示,如有图片请发邮件到:edu63@foxmail.com

姓      名:

内      容:

手机号码:

验  证  码:  换一张

确认提交
填写需求信息关闭
我们会根据您的需求匹配并审核留言

姓      名:

意向城市:

留      言:

手机号码:

验  证  码:  换一张

确认提交
完善补充本文信息关闭
非常感谢您帮助完善补充本文信息


 换一张

确认提交