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



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

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

因此,为了实现这一点,我将拥有名为MovementService的Runnables,它将在玩家之间分布玩家队列。可运行的数量取决于资源,因为在一个线程上为每个玩家排队意味着有很多滞后,所以至少会有4个可运行的线程,或者可以说是4个长时间运行的线程。这些可运行文件将被添加到FixedThreadPool中。

现在我的问题是,我将如何测试这个实现,因为这是一个长时间运行的线程,我不确定我将如何进行测试,因为我之前发布了一个类似的问题,但答案建议我更改整个设计。问题来了。答案中给出的方法不能在这里实现,因为我不能一直向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
    }
}

CCD_ 1接口扩展了CCD_。

您可以使用mocking框架(EasyMock)创建playerQueue的mock,并添加对应该调用的内容的期望。下一件事:

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

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

最新更新