如何制作Java线程以获得相当多的CPU时间



我是Java的新手。在发布此问题之前,我已经搜索了此网站。如果我的问题看起来很愚蠢,请原谅我。

我要寻找答案的代码下面给出了。

我的目的是让4名球员参加100米的比赛。主要是线程以最高优先级运行,因此它可以检查每个播放器进步的距离。我在主线程和子线程中都有编码的产量方法,以为主线程和儿童都将获得相当多的CPU时间。

此程序每次运行都会产生以下三个不同的输出。

  1. 它产生的"枪已经发射"消息,然后在控制台中没有显示任何消息。在这种情况下,主线程正在垄断CPU。

  2. 有些时间一个单一的"播放器"对象获得了所有CPU时间,并赢得比赛,而其他玩家对象都没有CPU时间。

  3. 很少所有播放器实例获得CPU时间,我可以看到每个播放器实例在控制台中产生消息。

我系统中的处理器是Core 2 Duo。

是否可以始终达到上面提到的"第三输出"?

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;                    
                } 
            }
        }
    }
}

OS试图将CPU平均分配在螺纹之间。我将使用倒数划线或类似的东西,而不是等待获胜者,因为您的Findwinner与跑步者一起竞争CPU。

使用系统。因为控制台输出在相应的控制台流上获取了监视器锁。如果没有,您将从多个线程中输出部分和jambled线。

因此,该循环中的控制台输出具有副作用,使这4个线程互相等待在控制台上输出消息。更糟糕的是:监视器锁不公平。

最新更新