У меня проблема с пониманием вывода следующего кода. Мое понимание вывода не будет иметь какой-либо конкретной последовательности, но PlayerX started
, PlayerX
и PlayerX died
должны быть в последовательности. И мы должны иметь всех игроков в журнале буферов и должны быть напечатаны в конце. Но иногда последовательность PlayerX started
, PlayerX died
, а затем PlayerX
, и в этих случаях имя игрока не в буфере. Может кто-нибудь указать, что мне не хватает?Понимание java многопоточной синхронизации
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Game {
public static void main(String[] args) {
Ball gameBall = new Ball();
ExecutorService executor = Executors.newFixedThreadPool(5);
Player[] players = new Player[50];
for (int i = 0; i < players.length; i++) {
Player playerTemp = new Player("Player" + i, gameBall);
executor.submit(playerTemp);
players[i] = playerTemp;
System.out.println(players[i].getName1() + " started");
}
for (int i = 0; i < players.length; i++) {
try {
players[i].join();
System.out.println(players[i].getName1() + " died");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* here all thread should die and following line should display
*all player name
* without any particular order
and should be last line.
*/
executor.shutdown();
System.out.println(gameBall.getLog());
}
}
...
class Player extends Thread {
private final String name;
private final Ball ball;
public Player(String aName, Ball aBall) {
name = aName;
ball = aBall;
}
@Override
public void run() {
ball.kick(name);
}
/**
* @return the name
*/
public String getName1() {
return name;
}
}
...
class Ball {
private volatile StringBuffer log;
public Ball() {
log = new StringBuffer();
}
public synchronized void kick(String aPlayerName) {
log.append(aPlayerName + " ");
System.out.println(aPlayerName);
}
public String getLog() {
return log.toString();
}
}
Вы можете разместить некоторый вывод, который показывает, что вы говорите около? – NormR