pause功能适用于java 6而不是java 7

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将不胜感激.

dim*_*414 5

尝试制作paused变量volatile.

应标记要在线程之间访问的变量,volatile以指示不应在线程之间缓存值.如果没有此标志,则线程可能无法看到另一个线程中的值已更改.

这个标志的功能和目的有点令人困惑,但有很多资源可以解释它:https://www.google.com/search?q = java + volatile