Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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
还有一些多任务java问题_Java_Multithreading_Multitasking - Fatal编程技术网

还有一些多任务java问题

还有一些多任务java问题,java,multithreading,multitasking,Java,Multithreading,Multitasking,我的任务是编写一个简单的游戏,模拟两个玩家一个接一个地进行1-3场比赛,直到一堆比赛结束。我设法让计算机选择随机值的比赛,但现在我想更进一步,让人类玩这个游戏。以下是我已经拥有的: 职业玩家是电脑玩家,玩家应该是人。问题是,PlayerMan的线程应该等到适当的匹配值被给出,但我不能让它以这种方式工作。当我输入这些值时,它有时会捕捉到它们并减少匹配的数量,但这并不完全是我的目的:)逻辑是:我检查当前播放器的值。如果它对应于当前活动线程的这一部分,我将使用scanner捕捉匹配的数量。否则我会等上

我的任务是编写一个简单的游戏,模拟两个玩家一个接一个地进行1-3场比赛,直到一堆比赛结束。我设法让计算机选择随机值的比赛,但现在我想更进一步,让人类玩这个游戏。以下是我已经拥有的:

职业玩家是电脑玩家,玩家应该是人。问题是,PlayerMan的线程应该等到适当的匹配值被给出,但我不能让它以这种方式工作。当我输入这些值时,它有时会捕捉到它们并减少匹配的数量,但这并不完全是我的目的:)逻辑是:我检查当前播放器的值。如果它对应于当前活动线程的这一部分,我将使用scanner捕捉匹配的数量。否则我会等上一秒钟(我知道这是一个相当苛刻的解决方案,但我不知道怎么做)。
共享类保留当前玩家的值以及匹配的数量

顺便问一下,我有没有办法让播放器和共享属性私有化而不是公有化,并且代码还能正常工作

控制台和输入对话框仅用于选择插入值的方式

class PlayerMan extends Player{

    static final int CONSOLE=0;
    static final int INPUT_DIALOG=1;
    private int input;

    public PlayerMan(String name, Shared data, int c){
    super(name, data);
    input = c;
    }

@Override
    public void run(){
        Scanner scanner = new Scanner(System.in);
        int n = 0;

        System.out.println("Matches on table: "+data.matchesAmount);
        System.out.println("which: "+data.which);
        System.out.println("number: "+number);

        while(data.matchesAmount != 0){
            if(number == data.which){

                System.out.println("Choose amount of matches (from 1 to 3): ");
                n = scanner.nextInt();

                if(data.matchesAmount == 1){
                    System.out.println("There's only 1 match left !");
                    while(n != 1){
                        n = scanner.nextInt();
                    }
                }
                else{
                    do{
                        n = scanner.nextInt();
                    }
                    while(n <= 1 && n >= 3);
                }

                data.matchesAmount = data.matchesAmount - n;
                System.out.println("                          "+
                        name+" takes "+n+" matches.");
                if(number != 0){
                    data.which = 0;
                }
                else{
                    data.which = 1;
                }
            }
            else{
                try {
                    Thread.sleep(1000);
                } catch(InterruptedException exc) {
                    System.out.println("End of thread.");
                    return;
                }
            }
            System.out.println("Matches on table: "+data.matchesAmount);
        }
        if(data.matchesAmount == 0){
            System.out.println("Winner is player: "+name);
            stop();
        }
    }
}
class PlayerMan扩展播放器{
静态最终int控制台=0;
静态最终整数输入对话框=1;
私有int输入;
公共玩家(字符串名、共享数据、int c){
超级(名称、数据);
输入=c;
}
@凌驾
公开募捐{
扫描仪=新的扫描仪(System.in);
int n=0;
System.out.println(“表上的匹配:“+data.matchesAmount”);
System.out.println(“which:+data.which”);
System.out.println(“编号:”+编号);
while(data.matchesAmount!=0){
if(number==data.which){
System.out.println(“选择匹配数量(从1到3):”;
n=scanner.nextInt();
如果(data.matchesAmount==1){
System.out.println(“只剩下1个匹配项了!”);
而(n!=1){
n=scanner.nextInt();
}
}
否则{
做{
n=scanner.nextInt();
}
而(n=3);
}
data.matchesAmount=data.matchesAmount-n;
System.out.println(“”)+
name+“接受”+n+“匹配项。”);
如果(数字!=0){
data.which=0;
}
否则{
data.which=1;
}
}
否则{
试一试{
睡眠(1000);
}捕获(中断异常exc){
System.out.println(“线程结束”);
返回;
}
}
System.out.println(“表上的匹配:“+data.matchesAmount”);
}
如果(data.matchesAmount==0){
System.out.println(“获胜者是玩家:+name”);
停止();
}
}
}

您应该与读写器锁同步编辑:再想想,也许一个简单的条件就足够了。您可以使用以下内容:

private Lock playerLock = new ReentrantLock();
private Condition[] playerConditions = { playerLock.newCondition(), playerLock.newCondition() };

// Later on:
while (data.matchesAmount != 0) {
  while (number != data.which) {
    playerConditions[number].await();
  }
  // do work here

  // now release the other player -- this assumes there are only 2
  data.which = 1 - number;
  playerConditions[1 - number].signalAll();
}

这里唯一的问题是,如果
data,您可能会阻止两个线程等待它们的条件。当它们到达这里时,
没有正确初始化。您应该确保在启动线程之前对其进行了初始化。

我刚刚发现了一些关于此方法的信息,还有wait()方法。所以我应该添加写入匹配数的方法来同步它并插入run()?@owca基本上,由多个线程读取或写入的任何数据都应该同步。您可以在执行此操作的方法周围使用
synchronized
关键字,您可以在方法内部使用
synchronized(object){…}
,您可以使用锁,也可以使用条件(如更新的答案所示)。永远不要尝试只使用变量,因为如果没有某种锁,就不能保证线程之间的数据是一致的。