毎秒実行される 2 つの executorservices があります。しかし、実行メソッドにコード行を挿入すると、そのうちの 1 つが実行を停止します。ここに私のクラスがあります:
ゲームサーバー:
public class GameServer implements Runnable {
private ServerManager server;
private int id;
public GameServer(ServerManager sm) {
server = sm;
id = server.idCreator();
server.registerGameServer(this);
}
@Override
public void run() {
System.out.println("Game server is collecting data every second");
}
public int getId() {
return id;
}
}
サーバーマネージャー:
import java.util.HashMap;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
public class ServerManager {
private final AtomicInteger count = new AtomicInteger(0);
private HashMap<Integer, GameServer> listofGameServers = new HashMap<>();
public ServerManager() {
}
public void registerGameServer(GameServer gs) {
listofGameServers.put(gs.getId(), gs);
}
public HashMap<Integer, GameServer> getGameServers() {
return new HashMap<>(listofGameServers);
}
public int idCreator() {
synchronized (count) {
return count.incrementAndGet();
}
}
public int generateRandomNumber(int start, int end) {
Random rand = new Random();
int number = start + rand.nextInt(end - start + 1);
return number;
}
}
プレーヤー:
import java.util.HashMap;
public class Player implements Runnable {
private int id;
private ServerManager server;
public Player(ServerManager sm) {
this.server = sm;
this.id = server.idCreator();
}
@Override
public void run() {
System.out.println("Player running every second");
HashMap<Integer, GameServer> listOfGameServers = server.getGameServers();
//int randomGameServer = listOfGameServers.get(server.generateRandomNumber(0, listOfGameServers.size()-1)).getId();
int a = server.generateRandomNumber(0, listOfGameServers.size() - 1);
System.out.println("Player selected a server: " + a);
}
public int getId() {
return id;
}
}
主要:
import java.util.concurrent.*;
public class TestDriver {
public static void main(String[] args) {
ServerManager server = new ServerManager();
ScheduledExecutorService game = Executors.newScheduledThreadPool(3);
for (int j = 0; j < 3; j++) {
game.scheduleAtFixedRate(new GameServer(server), 0, 1, TimeUnit.SECONDS);
}
ScheduledExecutorService prodExec = Executors.newScheduledThreadPool(3);
prodExec.scheduleAtFixedRate(new Player(server), 0, 1, TimeUnit.SECONDS);
}
}
Player
クラスには、コメント行のコードがあります。int randomGameServer =...
run メソッドは、期待どおりに毎秒スムーズに実行されます。しかし、コメントを外すと、プレーヤーの実行のメソッドは数回しか実行されずに停止します。私がやろうとしているのは、参加するゲームサーバーをランダムに選択するようにプレイヤーを誘導することです。なぜ止まるか分かる人いますか?
コメント行の結果 (プレーヤーは継続的に実行されます):
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 0
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 2
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 2
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 1
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 0
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 0
コメントを外した行の結果 (Player は数回実行されます):
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Player selected a server: 1
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Player running every second
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second
Game server is collecting data every second