Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
暂停功能在Java6而不是Java7中工作_Java_Multithreading - Fatal编程技术网

暂停功能在Java6而不是Java7中工作

暂停功能在Java6而不是Java7中工作,java,multithreading,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 MyK

我有一个程序,玩家玩游戏,用户可以输入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" );
    }
}
播放器线程

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();
            }
        }
    }
公共类播放器实现可运行{
链接列表手;
弦乐演奏者姓名;
国际战略选择;
int playerNumber;
私有布尔运行=真;
private=false;
public void setPaused(布尔值已暂停){
this.paused=暂停;
}
公共同步的无效运行(){
(跑步时){
如果(!暂停){
游戏();
}
}
}
“事件生成器”

MyKeyListenerThread elt=新建MyKeyListenerThread();
CardGame.addMyKeyListener(elt);
elt.start();
for(int i=0;i

我可以让程序暂停,但我无法让它恢复,即使它将“游戏已恢复”打印到终端,但它在java 6中正常恢复。java 7中发生了什么变化,或者只是我的代码。请提供帮助。

尝试使您的
暂停
变量
不稳定

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


这个标志的功能和用途有点令人困惑,但有很多资料对此进行了解释:

你调用的是一个繁忙的循环,它将使1个CPU保持100%的性能?!@Ingo可能OP所在的位置很冷。这段代码太混乱了,我怀疑它是否能够编译……尽管我现在最大的问题是识别n、 ..@BoristheSpider我的第一个多线程应用程序就是这样做的;只需对所有CPU征税到100%。使用您的CPU进行网格计算或比特币生成可能更好。对CPU征税以创建等待循环从来都不是。
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);
            }
        }