教育路上
摘要:java控制多个线程按照一定的顺序轮流执行,此时需要让线程间进行通信。java 多线程 顺序 轮流 执行。以下是我们为大家整理的,相信大家阅读完后肯定有了自己的选择吧。
2022-05-19 14:01网络推荐
如果想解决上述问题,就需要控制多个线程按照一定的顺序轮流执行,此时需要让线程
间进行通信。在 Object 类中提供了 wait( )、notify( )、notiyAll()方法用于解决线程间的通信
问题,由于 Java 中所有类都是 Objet 类的子类或间接子类,因此任何类的实例对象都可以直
接使用这些方法。接下来通过表 14-2 详细说明这几个方法的作用。
表 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 所示。
例 14-18 的 Storage 类是对例 14-15 的改写,首先通过使用 synchronized 关键将 put()方法和
get( )方法修饰为同步方法,之后每操作一次数据,便调用一次 notify()方法唤醒对应同步锁上
等待的线程。当存入数据时,如果 count 的值与 cells 数组的长度相同,说明数组已经添满,
此时就需要调用同步锁的 wait( )方法使存入数据的线程进入等待状态,同理,当取出数据时
如果 count 的值为 0,说明数组已被取空,此时就需要调用同步锁 wait()方法,使取出数据的
线程进入等待状态。从运行结果可以看出,存入数据和取出的数据都是依次递增的自然数。
访客的评论 2023/09/29 21:47
文中描述的是准确的吗,如何报名!