java - 如何测试长时间运行的线程

标签 java multithreading unit-testing server

我正在为我的最后一年项目开发一款多人游戏,目前正在服务器领域工作。在服务器中,我正在研究移动区域,其工作原理如下

玩家进行移动 -> 将包含移动详细信息的数据包发送到服务器 -> 服务器将移动放入包含在玩家对象内的队列中-> 服务器不断循环连接所有玩家 -> 服务器检查玩家的移动队列 -> 服务器更新玩家的位置 ->服务器将移动详细信息发送给其他客户端。

因此,为了实现这一目标,我将拥有名为 MovementService 的 Runnables,它会将玩家队列分布在它们之间。可运行的数量取决于资源,因为在一个线程上让每个玩家排队意味着很大的延迟,因此至少会有 4 个可运行的线程,或者可以说 4 个长时间运行的线程。这些可运行对象将被添加到固定线程池中。

现在我的问题是如何测试这个实现,因为这是一个长时间运行的线程,我不确定如何测试它,因为我之前已经发布了类似的问题,但答案建议我更改整个设计。 Here是问题。答案中给出的方法无法在这里实现,因为我无法继续将服务器上收到的每个移动数据包的短可运行数据提交到线程池。

我的问题是我应该如何测试这个 Runnable 实现。还有其他更好的方法吗?

这是我的移动服务的相关代码

public class DefaultMovementService implements MovementService{

    @Override
    public void run() {
        while(isRunning){
            synchronized (playerQueue) {
                playerQueue.forEach(player -> move(player));
            }
        }
    }

    private void move(Player player) {
        //If player tank has movement, move the tank.
        //Send the movement to the other clients on the same map
    }
}

MovementService 接口(interface)扩展了 Runnable

最佳答案

您可以使用模拟框架(EasyMock)来创建playerQueue的模拟并添加对应该调用的内容的期望。 接下来的事情:

   @Override
    public void run() {
        while(isRunning){
            synchronized (playerQueue) {
                playerQueue.forEach(player -> move(player));
            }
        }
    }

这个while running对于此任务来说,这是非常容易出错的方法。 创建一个调度线程池并提交此任务以某个固定速率(例如 10 毫秒)运行并删除 while(isRunning);您可以通过调用 ScheduledFutute<?> future.cancel(false); 取消定时任务

关于java - 如何测试长时间运行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575839/

相关文章:

unit-testing - NativeScript Angular2 应用程序中的测试组件

java - Jenkins 可以在 slave 日志上自定义插件到 master 吗?

java - 为什么在 JFrame 上显示 JOptionPane 时我的应用程序会卡住?

java - 反射性地获取项目中的所有包?

C# Timer on Elapsed Time 不调用方法

iphone - 如何告诉 iPhone OS 功能停止/取消?

c# - 单元测试错误 "Object reference not set to an instance of an object."

带有 Int 数组的 Java HashMap

java - System.getProperty ("line.separator")不工作 - Android Studio

ios - NSMutableDictionary - EXC BAD ACCESS - 同时读/写