use*_*140 9 java multithreading
我有一个玩家玩游戏的程序,用户可以使用事件监听器输入p或r来暂停和恢复游戏,这个功能在java 6中有效,但在java 7中没有,我不明白为什么不行.有人可以帮忙吗
事件监听器线程
public class MyKeyListenerThread extends Thread implements MyKeyListener{
/**
* This is the overriden keyPressedEvent method, used
* to respond to [@link MyKeyPressed] events and pause or resume
* [@link Player] threads according to the source details.
*
* @param evt The event the listener will respond to
*/
@Override
public void keyPressedEvent( MyKeyEvent evt ){
Object o = evt.getSource();
//checks source to see whether to pause or resume game
if( o.equals("p") ){
for ( Player player : CardGame.players ){
player.setPaused( true );
Logger.addToOutput( player.getPlayerName(), "The game has been paused\n" );
}
System.out.println( "The game has been paused" );
}else if ( o.equals("r") ){
for ( Player player : CardGame.players ){
player.setPaused( false );
Logger.addToOutput( player.getPlayerName(), "The game has been resumed\n" );
}
System.out.println( "The game has been resumed" );
}
}
/**
* This is the overidden run method, which will
* run infinitely in the background.
*/
@Override
public void run(){
for(;;) {
}
}
}
System.out.println( "The game has been paused" );
}else if ( o.equals("r") ){
for ( Player player : CardGame.players ){
player.setPaused( false );
Logger.addToOutput( player.getPlayerName(), "The game has been resumed\n" );
}
System.out.println( "The game has been resumed" );
}
}
Run Code Online (Sandbox Code Playgroud)
玩家线程
public class Player implements Runnable{
LinkedList<Card> hand;
String playerName;
int strategyChosen;
int playerNumber;
private boolean running = true;
private boolean paused = false;
public void setPaused( boolean paused ){
this.paused = paused;
}
public synchronized void run(){
while(running){
if(!paused){
playGame();
}
}
}
Run Code Online (Sandbox Code Playgroud)
"事件发生器"
MyKeyListenerThread elt = new MyKeyListenerThread();
CardGame.addMyKeyListener( elt );
elt.start();
for ( int i = 0; i < players.length; i++){
new Thread( players[i] ).start();
}
while(running){
String input = reader.next();
CardGame.pressed = true;
fireMyKeyEvent( new MyKeyEvent(input) );
}
private static void addMyKeyListener( MyKeyListener t) {
MyKeyListener[] tmp = new MyKeyListener[listeners.length+1];
for (int i = 0; i < listeners.length; i++)
tmp[i] = listeners[i];
tmp[listeners.length] = t;
listeners = tmp;
}
private static void fireMyKeyEvent(MyKeyEvent evt) {
for ( MyKeyListener keyListener : listeners ) {
keyListener.keyPressedEvent(evt);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以让程序暂停但是我无法恢复它,即使它打印到终端"游戏已经恢复",但它在java 6中正常恢复.在java 7中有什么变化,或者它只是我的代码.Help将不胜感激.
尝试制作paused变量volatile.
应标记要在线程之间访问的变量,volatile以指示不应在线程之间缓存值.如果没有此标志,则线程可能无法看到另一个线程中的值已更改.
这个标志的功能和目的有点令人困惑,但有很多资源可以解释它:https://www.google.com/search?q = java + volatile