Java中定时的类和任务到期

时间:2016-07-01 22:27:11

标签: java multithreading

我有一台服务器,其中有多个客户端连接。每个连接都会产生一个新的线程,然后它会独立运行。

我现在面临制作大厅的任务,可以创建多个WaitingRooms。 2分钟后,WaitingRoom将为列表中注册的玩家开始游戏。

问题在于:我怎样才能拥有定时线程?我在想这些解决方案:

  • 创建一个SingleThreadExecutor并使WaitingRooms实现Callable,这样在2分钟后我可以调用它们。
  • 创建与WaitingRoom相关联的线程,使用Wrapper类执行此操作,该类具有Runnable,每秒可以将变量减少一个" timer"直到达到零。
  • 创建一个具有通过它们运行的​​线程的List的类,调用一个方法来减少变量" timer"。

我也将这个时钟用于PlayerTurns和Connections。

我不想重新发明时钟,我确信我不是第一个做这样事情的人:有标准的方法吗?

2 个答案:

答案 0 :(得分:1)

我会使用java.util.Timerjava.util.TimerTask。这样你就不必创建自己的计时线程了。

答案 1 :(得分:1)

创建一个后台Thread并在该线程上使用Thread.sleep()等待两分钟。 (注意thread.sleep()需要毫秒)

(我假设这是与玩家的游戏)

示例(假设您有一个玩家加入的方法):

public void onPlayerJoin() {
    waitForPlayers();
}

boolean isWaiting = false;

public void waitForPlayers() {
    if (!isWaiting) {
        isWaiting = true;
        new Thread("background").sleep(millis);
        // Now that we have waited, start the game
        isWaiting = false;
        game.start();
    }
}

玩家加入时会调用此方法。如果它已经在等待,它什么都不做。但是,如果它没有等待,它会创建一个线程,使其休眠2分钟,然后继续开始游戏。

修改

此外,如果你想在开始游戏之前关闭玩家线程(或任何地方(如果玩家线程在ArrayList中)

for (Player p : Players) {
    try { p.join(); } catch (InterruptedException e) { e.printStackTrace(); }
}