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

时间:2015-11-06 21:15:03

标签: java multithreading unit-testing server

我正在为我的最后一年项目开发多人游戏,目前正在服务器领域工作。在服务器中,我正在处理运动区域,其工作方式如下

播放器进行移动 - > 将数据包发送到服务器,并提供移动详细信息 - > 服务器将移动排入队列中,该队列包含在播放器对象 - > 服务器继续循环连接所有连接的播放器 - > 服务器检查播放器的移动队列 - >服务器更新播放器的位置 - > 服务器将移动详细信息发送给其他客户端。

为了达到这个目的,我将使用名为MovementService的Runnables,它们将在其间分配玩家队列。可运行的数量取决于资源,因为在一个线程上排队每个玩家意味着很多延迟,因此将至少有4个可运行的或者可以说4个长运行的线程。这些runnable将被添加到FixedThreadPool。

现在我的问题是我将如何测试这个实现,因为这是一个长期运行的线程,我不知道我将如何测试它,因为我之前发布了类似的问题,但答案建议我改变我的整个设计。 Here是个问题。答案中给出的方法无法在此实现,因为我无法继续为服务器上收到的每个移动数据包提交短流程到ThreadPool。

我的问题是我应该如何测试这个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界面扩展Runnable

1 个答案:

答案 0 :(得分:1)

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

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

这个while running非常容易出错。 创建一个预定的线程池并提交此任务以某个固定的速率运行(例如10毫秒)并删除while(isRunning);您可以致电ScheduledFutute<?> future.cancel(false);

取消计划任务