默认Helper类提供了以下标准内置调用套件,供在规则表达式中使用。这些主要用于条件和动作表达式中,但它们也可以在事件绑定中被调用。它们提供的功能旨在使执行复杂测试变得容易,特别是协调多线程应用程序中线程的动作。内置操作分为三类:线程协调操作、规则状态管理操作和跟踪与调试操作。

线程协调操作

1. 等待者(Waiters)

规则引擎提供了 Waiters,用于在规则执行期间挂起线程,然后让其他线程唤醒它们。唤醒可以简单地允许挂起的线程继续执行它所暂停的规则,或者强制等待的线程从触发方法中以异常退出。Helper类定义的 API 如下:

public void waitFor(Object identifier)
public void waitFor(Object identifier, long millisecsWait)
public boolean waiting(Object identifier)
public boolean signalWake(Object identifier)
public boolean signalWake(Object identifier, boolean mustMeet)
public boolean signalThrow(Object identifier)
public boolean signalThrow(Object identifier, boolean mustMeet)

与 CountDowns 一样,Waiters 由任意对象标识。需要注意的是,等待操作并不是通过在标识符上调用 Object.wait 来执行的,这样做可能会干扰触发方法或其调用者执行的锁定和同步操作。标识符仅用于规则引擎,以关联等待和信号操作。Helper类使用其自己的私有 Waiter 对象来管理同步活动。

注意:这种行为确保了多个线程尝试从规则条件发出信号以唤醒等待线程之间的竞争只能有一个赢家。

可选参数 mustMeet

在无法保证等待线程会在信号线程到达其触发点之前到达其触发点的情况下,mustMeet 参数非常有用。如果此参数设置为 true,信号线程将不会传递其信号,直到另一个线程在等待。如果必要时,信号线程将挂起,直到一个等待线程到达。提供值 false 相当于省略可选参数。

2. 集合点(Rendezvous)

Waiters 在存在不对称关系的情况下非常有用:一个或多个线程需要等待由另一个线程发出的事件。集合点提供了一种在没有这种不对称性的情况下进行同步的方法。集合点还提供了一种引入不对称性的方式,因为它按到达顺序对线程进行排序。从集合点内置返回的值可以被检查,以识别,例如,第一个(或最后一个)到达的线程,这个线程可以是触发其动作的线程。

API 方法

public boolean createRendezvous(Object identifier, int expected)
public boolean createRendezvous(Object identifier, int expected, boolean rejoinable)
public boolean rendezvous(Object identifier)
public boolean rendezvous(Object identifier, long timeout)
public boolean isRendezvous(Object identifier, int expected)
public int getRendezvous(Object identifier, int expected)
public int deleteRendezvous(Object identifier, int expected)

3. 加入者(Joiners)

Joiners 在需要确保一个线程在继续之前等待一个或多个相关线程退出的情况下非常有用。这并不总是应用程序正确执行的要求,但可能需要验证测试场景。例如,套接字监听器线程可能会创建连接管理器线程来处理传入的连接请求。监听器可能使用连接对象通知连接管理器线程强制退出。它不一定需要保留对连接线程的句柄,并显式调用 Thread.join() 以确保线程退出时被通知。然而,测试可能想要检查线程池以确保所有活动都已完成。这意味着测试需要能够累积一个管理线程列表,然后随后从管理器线程或测试线程加入它们。

API 方法

public boolean createJoin(Object identifier, int expected)
public boolean isJoin(Object identifier, int expected)
public boolean joinEnlist(Object identifier)
public boolean joinWait(Object identifier, int expected)
public boolean joinWait(Object identifier, int expected, long timeout)

4. 中止执行

规则引擎提供了两个用于规则动作的内置方法,允许中止触发方法的执行。Helper类定义的 API 如下:

public void killThread()
public void killJVM()
public void killJVM(int exitCode)
FunTester 原创精华

【连载】从 Java 开始性能测试


↙↙↙阅读原文可查看相关链接,并与作者交流