while循环可以等待事件继续java

时间:2013-08-27 08:46:03

标签: java wait

我有一个使用JOptionPane来引起用户猜测的刽子手引擎,但是现在我正在实现一个带有文本字段的GUI,我需要一种方法来阻止引擎并让用户从文本字段中猜出 - 我我试图使用MVC所以当前来自文本字段的数据被发送到主/控制器类但是在将数据加载到主类中的变量之后 - 我开始无法将这些数据集成到引擎中

我不知道在发动机上添加等待是否是最好的事情,但这是我能想到的全部。

这是我的引擎类:

public class engine {
    char [] charda = new char[20];
    char [] charwo = new char[20];
    Highscore words = new Highscore();
    main mn = new main();
    int guesses =7;
    char guess;

    public engine() {
    }

    public void enginer(){

        int count = 0;
        String word = words.getWord();

        for (int i = 0; i<word.length(); i++)
        {
            //instantiates two arrays one of dahses and one with the word
            charwo[count] = word.charAt(i);
            charda[count]= '_';
            count++;
        }

        for (int l=0; l<count; l++)
        {
            System.out.print(" "+charda[l]);
        }

        while (guesses != 0 && !Arrays.equals(charwo, charda))
        {
            System.out.println("");
            guess = JOptionPane.showInputDialog("enter a Guess").charAt(0);

            if (word.toUpperCase().contains(String.valueOf(guess).toUpperCase()))
            {
                for (int k = 0; k<word.length(); k++)
                {
                    if (String.valueOf(guess)
                            .toUpperCase()
                            .equals( String.valueOf(charwo[k]).toUpperCase() ))
                    {
                        charda[k]=charwo[k];

                        for(int l=0; l<count; l++)
                        { // prints dashes here to avoid a letter being 
                          // chopped off by the program stopping in the middle
                            System.out.print(" "+charda[l]);

                        }
                    }
                }
            }
            else
            {
                guesses = guesses-1;
                System.out.println("guesses left "+guesses);
                //
                //Re-displays dashes 
                for (int l=0; l<count; l++)
                {
                    System.out.print(" "+charda[l]);
                }
            }

            if (Arrays.equals(charwo, charda))
            {
                System.out.println("");
                System.out.println("You are Winner");

            }
        }
    }
}

这是我的主类中处理按钮单击的部分

public void buttonClicked ()
{
    gameplay gp = new gameplay(); 
    engine en  = new engine();

    en.guess = gp.getInput; // this is where I try send the input from the text field to the engine
    en.enginer(); 

    System.out.println("button clicked"); 
}

我此刻真的迷失了,所以即使是朝正确方向点头也会有所帮助:)

1 个答案:

答案 0 :(得分:4)

通常可以使用wait/notify内置java机制来实现等待。

虽然你可以找到一堆解释这个问题的教程,但这是一个非常简短的解释。

java中的每个类都自动扩展java.lang.Object,定义方法wait()notify()。等待挂起当前线程,直到在同一对象上调用notify()。用于调用wait()notify()的对象称为 monitor 。遵循java线程管理规则,必须从synchronized块调用这两个方法,即

synchronized(obj) {
    obj.wait();
}

现在你的问题的答案很简单。定义从两个点可见的监视器对象(我的意思是应该等待的代码和应该触发第一个线程继续的代码)。

实施等待:

synchronized(obj) {
    obj.wait();
}

当使用点击按钮(因此您希望等待退出)时,您应该调用代码:

synchronized(obj) {
    obj.notify();
}

就是这样。请注意,wait的版本超时,并且notifyAll()也有{{1}}。恕我直言需要一些时间来学习java线程,同步等等。这很有趣。祝好运。