暂停功能在Java6而不是Java7中工作
我有一个程序,玩家玩游戏,用户可以输入p或r来暂停和恢复游戏,使用事件侦听器,这个功能在java 6中有效,但在java 7中无效,我不明白为什么不行。有人能帮忙吗 事件侦听器线程暂停功能在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
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);
}
}