gpt4 book ai didi

java - 控制线程流

转载 作者:行者123 更新时间:2023-11-29 06:22:08 25 4
gpt4 key购买 nike

我的任务是编写一个简单的游戏,模拟两名玩家接连进行 1-3 场比赛,直到比赛结束。我设法让计算机选择匹配的随机值,但现在我想更进一步,让人类玩这个游戏。这是我已经拥有的:http://paste.pocoo.org/show/201761/

Player类是电脑玩家,PlayerMan应该是人类。问题是,PlayerMan 的线程应该等到给出正确的匹配值,但我不能让它以这种方式工作。逻辑如下:线程运行直到匹配项为零。如果此时玩家号码正确,则调用函数 pickMatches()。在减少表上的匹配数量后,线程应该等待并且应该通知另一个线程。我知道我必须使用 wait() 和 notify() 但我无法正确放置它们。Class Shared 保留当前玩家的值(value),以及比赛的数量。

public void suspendThread() {
suspended = true;
}

public void resumeThread() {
suspended = false;
}

@Override
public void run(){
int matches=1;
int which = 0;
int tmp=0;
Shared data = this.selectData();
String name = this.returnName();
int number = this.getNumber();

while(data.getMatches() != 0){

while(!suspended){

try{
which = data.getCurrent();

if(number == which){

matches = pickMatches();

tmp = data.getMatches() - matches;
data.setMatches(tmp, number);

if(data.getMatches() == 0){
System.out.println(" "+
name+" takes "+matches+" matches.");
System.out.println("Winner is player: "+name);
stop();
}

System.out.println(" "+
name+" takes "+matches+" matches.");

if(number != 0){
data.setCurrent(0);
}
else{
data.setCurrent(1);
}
}
this.suspendThread();
notifyAll();
wait();

}catch(InterruptedException exc) {}
}
}
}

@Override
synchronized public int pickMatches(){
Scanner scanner = new Scanner(System.in);
int n = 0;
Shared data = this.selectData();

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

if(data.getMatches() == 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);
}
return n;
}

最佳答案

好吧,我首先要说的是,我认为您使这件事变得比您需要的更加艰难。如果是我,我会创建一个“GameMaster”类,其工作是循环并在轮到每个玩家时告诉他们。您的播放器类不会有循环,只有一个 takeTurn 方法。这样你就可以从你的播放器类中删除等待/通知行为。

如果你想保留你的设计,我仍然会去掉等待/通知并使用 Semaphore .检查文档以正确使用,但要点是您将删除挂起/恢复方法并在循环顶部调用 acquire() 并在底部调用 release。只需确保在构造函数中将 fairness 设置为 true 即可,这样您就不必担心玩家连续两次获取信号量锁而连续进行两轮。

关于java - 控制线程流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com