Java - 线程问题

时间:2013-03-30 23:02:36

标签: java multithreading thread-sleep

好的,我只学习了大约一周的java,并决定我想制作一个基于文本的游戏。 在我开始使用线程之前,一切都运行顺利。 我希望能够检测用户是否在游戏的任何部分输入“inv”来检查他们的库存。 唯一的问题是当我开始游戏时,控制台会问“你想玩游戏吗?”你必须两次输入'是'。我认为这是因为该线程有一个if语句,用于检查它是否等于'inv',然后检查用户是否输入'yes'来启动游戏。

(我知道它可能是非常低效的代码,它是我的第一个游戏xD)


主类

import java.util.Scanner;

public class Game extends gameClass{

    public static void main(String[] args) throws InterruptedException{

        Scanner input = new Scanner(System.in);

        Thread t1 = new Thread(new gameClass());
        t1.start();

        Menu.menu();
        gameClass.beginning();

    }
}

菜单类

import java.util.Scanner;

public class Menu{

    public static void menu() throws InterruptedException{

        Scanner input = new Scanner(System.in);//keyboard input

        boolean playingGame=false;
        String yesno;

        System.out.println("Welcome! Would you like to play?");

        while(playingGame==false){//repeats if until user input yes/no.
            yesno = input.nextLine();

        if (yesno.equalsIgnoreCase("yes")){

            playingGame = true;
            System.out.println("Great!");

这里是来自'gameClass'

的帖子
public void run(){
    Scanner input = new Scanner(System.in);

    try{
        while(true){
            if (input.nextLine().equalsIgnoreCase("inv")){
                System.out.println(inventory);

            }else if ((input.nextLine().equalsIgnoreCase("help"))||(input.nextLine().equalsIgnoreCase("what do i do"))){
                help();

            }
            Thread.sleep(200);
        }
    }catch(Exception e){}
}

public static void help(){

}
}

注意:我没有粘贴所有代码。


所以当控制台问'欢迎!你想玩?'我必须首先输入'yes',因为线程正在检查下一个输入是否为'inv'然后我可以继续输入'yes'来告诉我想要播放的节目。

任何帮助都会受到赞赏,这让我疯狂。

如果您需要更多信息,请问我:)

2 个答案:

答案 0 :(得分:1)

你的游戏中应该只有一个循环。您读取输入(一次),检查它是否为inv或其他,如果不是,则运行常规代码。我觉得绝对没有理由在那里有一个线程。事实上,你必须两次输入yes是有意义的:因为你是从同一输入中听到两次,也许是第一次检查它是否等于inv的线程听到它,并且在第二次正确的线程完成了这项工作。

答案 1 :(得分:0)

如果你做线程,你应该让所有的控制台I / O都来自一个线程。您有两个Scanner实例彼此异步运行。即使您已经解决了要求启动游戏的具体问题,您仍然可能会遇到哪种情况下您不知道哪个线程会首先获取您的输入。通常,不同的线程不应该尝试使用相同的资源。