@Override
  public void run() {
    LinkedList<Thread> nextMoveThreads = new LinkedList<Thread>();
    final TreeMap<String, String> playersMoves = new TreeMap<String, String>();
    final LinkedList<Player> playersInformed = new LinkedList<Player>();

    for (final Player player : game.getPlayers()) {
      System.out.println(player.getId());
      nextMoveThreads.addLast(
          new Thread(
              new Runnable() {
                public void run() {
                  while (game.isRunning()) {
                    try {
                      Long startTime = System.currentTimeMillis();
                      String move = new NextMoveRequest().send(player.getMessagesPipe());
                      synchronized (playersMoves) {
                        playersMoves.put(player.getId(), move);
                        if (playersMoves.size() < game.getPlayers().size()) {
                          while (playersMoves.size() < game.getPlayers().size()) {
                            // we have received all moves!
                            try {
                              playersMoves.wait();
                            } catch (InterruptedException e) {
                              // ignore
                            }
                          }
                        } else {
                          playersMoves.notifyAll();
                        }
                      }
                      if (move.equals(ServerGameThread.DEATH_MESSAGE)) {
                        return;
                      }
                      new ShowMovesRequest(playersMoves).send(player.getMessagesPipe());

                      synchronized (playersInformed) {
                        playersInformed.addLast(player);
                        if (playersInformed.size() < game.getPlayers().size()) {
                          while (playersInformed.size() < game.getPlayers().size()) {
                            try {
                              playersInformed.wait();
                            } catch (InterruptedException e) {
                              // ignore
                            }
                          }
                        } else {
                          playersInformed.notifyAll();
                        }
                      }

                      long sleep =
                          ServerGameThread.SINGLE_TURN_TIME_MS
                              - (System.currentTimeMillis() - startTime);

                      if (sleep > 0) {
                        try {
                          Thread.sleep(sleep);
                        } catch (InterruptedException e) {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                        }
                      }
                    } catch (RequestSendingException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                    } catch (ConnectionLostException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                    }
                  }
                }
              }));
    }
    try {
      // workaround na problem ze NEXT zostanie wyslane zanim klient bedzie
      // gotowy odbierac
      Thread.sleep(1000);
    } catch (InterruptedException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }

    for (Thread nextMoveThread : nextMoveThreads) {
      nextMoveThread.start();
    }

    for (Thread nextMoveThread : nextMoveThreads) {
      try {
        nextMoveThread.join();
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  public ServerGameThread(Game game) {
    super();
    this.game = game;

    System.out.println(game.getPlayers().size());
  }