2016-07-01 13 views
0

複数のクライアントが接続するサーバーがあります。各接続は新しいスレッドを生成し、新しいスレッドが独立して動作します。Javaで期限切れのクラスとタスク

私は現在、複数のWaitingRoomsを作成できるロビーを作成する作業に直面しています。 2分後、リストに登録されたプレイヤーのためにWaitingRoomがゲームを開始します。

問題は次のとおりです。どのようにタイムドスレッドを作成できますか?私はこれらのソリューションを考えていました:

  • SingleThreadExecutorを作成してWaitingRoomsを呼び出し可能にすることで、2分後にgetを呼び出すことができます。
  • WaitingRoomに関連付けられたスレッドを作成し、Wrapperクラスを使用してスレッドを作成します.Wrapperクラスには、0に達するまで1秒ごとに変数「timer」が減少するRunnableがあります。
  • スレッドが実行されているListを持つクラスを作成し、変数「timer」を減らすメソッドを呼び出します。

この時計はPlayerTurnsとConnectionsにも適用されます。

私は時計を再発明したくありません。私はこのようなことをやっている最初の人ではないと確信しています:標準的な方法はありますか?

+0

多くの質問がありますし、このトピックの回答:以下で説明するように、「ScheduledExecutorService」を検索し、現代的な方法については[Oracle Tutorial](http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html)を参照してください。これを行う古い方法で 'Timer'と' TimerTask'を検索します(ServletやJava EEサーバでは*推奨されていません)。 –

答えて

1

Threadを作成し、そのスレッドでThread.sleep()を使用して2分間待機します。

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(); 
    } 
} 

この:(あなたはプレイヤーが参加したときのための方法を持っていると仮定すると)

例(私はこれがプレイヤーとゲームであると仮定しています)

を(thread.sleep()はミリ秒単位で取ることに注意してください)メソッドは、プレーヤーが参加するときに呼び出されます。すでに待機している場合は、何もしません。ただし、待機していない場合はスレッドを作成し、2分間スリープさせてからゲームを開始します。

EDIT:また

、あなたは選手のスレッドがArrayListの中にある場合は(どこでもゲームを開始する(または前のプレーヤーのスレッドを閉じたい場合)

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

java.util.Timerjava.util.TimerTaskを使用します。こうすることで、独自のタイミングスレッドを作成する必要がなくなります。

+2

これらは廃止されました。代わりにScheduledExecutorServiceを使用してください。 –

+1

もっと新しいものや複雑なものがあるというだけで、古いものではないというわけではありません。 –

+0

@JBNizetしかし、私はそれを取得するときにScheduledExecutorServiceを停止し、スレッドを殺すことはありませんか?それはもっと複雑ではありませんか? – Vale

関連する問題