You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kp...@apache.org on 2013/11/11 20:06:36 UTC
svn commit: r1540809 - in /tomcat/tc7.0.x/trunk: ./
webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java
Author: kpreisser
Date: Mon Nov 11 19:06:36 2013
New Revision: 1540809
URL: http://svn.apache.org/r1540809
Log:
Merged revision(s) 1540807 from tomcat/trunk:
Only schedule a TimerTask when the first player enters the Room (and cancel it if the last player exits the Room).
Modified:
tomcat/tc7.0.x/trunk/ (props changed)
tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java
Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
Merged /tomcat/trunk:r1540807
Modified: tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java?rev=1540809&r1=1540808&r2=1540809&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java (original)
+++ tomcat/tc7.0.x/trunk/webapps/examples/WEB-INF/classes/websocket/drawboard/Room.java Mon Nov 11 19:06:36 2013
@@ -109,6 +109,15 @@ public final class Room {
*/
private final Timer drawmessageBroadcastTimer = new Timer();
+ private static final int TIMER_DELAY = 30;
+
+ /**
+ * The current active broadcast timer task. If null, then no Broadcast task is scheduled.
+ * The Task will be scheduled if the first player enters the Room, and
+ * cancelled if the last player exits the Room, to avoid unnecessary timer executions.
+ */
+ private TimerTask activeBroadcastTimerTask;
+
/**
* The current image of the room drawboard. DrawMessages that are
@@ -139,9 +148,10 @@ public final class Room {
roomGraphics.setBackground(Color.WHITE);
roomGraphics.clearRect(0, 0, roomImage.getWidth(),
roomImage.getHeight());
+ }
- // Schedule a TimerTask that broadcasts draw messages.
- drawmessageBroadcastTimer.schedule(new TimerTask() {
+ private TimerTask createBroadcastTimerTask() {
+ return new TimerTask() {
@Override
public void run() {
invokeAndWait(new Runnable() {
@@ -151,7 +161,7 @@ public final class Room {
}
});
}
- }, 30, 30);
+ };
}
/**
@@ -172,6 +182,13 @@ public final class Room {
// Add the new player to the list.
players.add(p);
+ // If currently no Broacast Timer Task is scheduled, then we need to create one.
+ if (activeBroadcastTimerTask == null) {
+ activeBroadcastTimerTask = createBroadcastTimerTask();
+ drawmessageBroadcastTimer.schedule(activeBroadcastTimerTask,
+ TIMER_DELAY, TIMER_DELAY);
+ }
+
// Send him the current number of players and the current room image.
String content = String.valueOf(players.size());
p.sendRoomMessage(MessageType.IMAGE_MESSAGE, content);
@@ -200,6 +217,18 @@ public final class Room {
boolean removed = players.remove(p);
assert removed;
+ // If the last player left the Room, we need to cancel the Broadcast Timer Task.
+ if (players.size() == 0) {
+ // Cancel the task.
+ // Note that it can happen that the TimerTask is just about to execute (from
+ // the Timer thread) but waits until all players are gone (or even until a new
+ // player is added to the list), and then executes. This is OK. To prevent it,
+ // a TimerTask subclass would need to have some boolan "cancel" instance variable and
+ // query it in the invocation of Room#invokeAndWait.
+ activeBroadcastTimerTask.cancel();
+ activeBroadcastTimerTask = null;
+ }
+
// Broadcast that one player is removed.
broadcastRoomMessage(MessageType.PLAYER_CHANGED, "-");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org