我对Java很陌生。在发布这个问题之前,我已经搜索了这个网站。如果我的问题看起来很蠢,请原谅我。
下面给出了我正在寻找答案的代码。
我的目的是让4名球员参加100米赛跑。主要是线程是以最高优先级运行的,因此它可以检查每个玩家的进展有多远。我在主线程和子线程中都编写了生成方法,认为主线程和子线程都会得到相当多的CPU时间。
该程序为每次运行生成以下三个不同的输出。
我的系统中的处理器是核心2双。
能否始终达到上述“第三输出”?
class Player implements Runnable{
int noOfMetersCrossed = 0;
Gun gun;
String name;
Player(Gun gun,String name) {
this.gun = gun;
this.name = name;
new Thread(this,name).start();
}
public void run() {
try{
synchronized(gun){
gun.wait();
}
} catch(InterruptedException e){
}
System.out.println(name+" started running");
while(noOfMetersCrossed < 100){
noOfMetersCrossed++;
System.out.println(name + " crossed " + noOfMetersCrossed + " meters");
Thread.yield();
}
}
}
class Gun {
void fire(){
synchronized(this){
System.out.println("Gun is Fired");
notifyAll();
}
}
}
public class Refree {
public static void main(String arg[]){
Gun gun = new Gun();
Player participants[] = new Player[4];
for(int i=0;i < 4;i++) {
participants[i] = new Player(gun, "Player "+i);
}
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
gun.fire();
findWinner(participants);
}
static void findWinner(Player participants[]){
outer: while(true){
Thread.yield();
for(int i=0;i <4;i++) {
if (participants[i].noOfMetersCrossed == 100){
System.out.println("The winner is " + participants[i].name);
break outer;
}
}
}
}
}
发布于 2014-01-20 19:53:11
操作系统试图在线程之间平均分配CPU。而不是循环等待赢家,我会使用CountDownLatch或类似的东西,因为您的findWinner是竞争的CPU与跑步者。
发布于 2021-02-09 06:24:30
任何在7年后使用System.{ output }.println()的人在繁忙循环中的任何地方都是这种“测量”的坏主意,仅仅是因为控制台输出在相应的控制台流上获得了一个监视器锁。如果没有,则会从多个线程输出部分和杂乱的行。
因此,该循环中的控制台输出有一个副作用,使这4个线程在控制台上等待对方输出消息。更糟糕的是:监视器锁不公平。
https://stackoverflow.com/questions/21242664
复制相似问题