簡體   English   中英

如何讓 Java 線程獲得相當數量的 CPU 時間

[英]How to make Java threads to get fair amount of CPU time

我是 Java 新手。 在發布這個問題之前,我已經搜索過這個網站。 如果我的問題看起來很愚蠢,請原諒我。

下面給出了我正在尋找答案的代碼。

我的目的是讓 4 名選手參加 100 米跑比賽。 Main 線程以最高優先級運行,因此它可以檢查每個玩家的進度。 我在主線程和子線程中都編寫了 Yield 方法,認為主線程和子線程都會獲得相當多的 CPU 時間。

該程序為每次運行生成以下三種不同的輸出。

  1. 它產生““Gun is Fired”消息,之后控制台中沒有顯示消息。在這種情況下,看起來主線程正在壟斷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;                    
                } 
            }
        }

    }
}

操作系統嘗試在線程之間平均分配 CPU。 而不是循環等待獲勝者,我會使用 CountDownLatch 或類似的東西,因為您的 findWinner 與跑步者一起爭奪 CPU。

任何人在 7 年后看到這個,在忙循環中的任何地方使用 System.{out|err}.println() 對於這種“測量”來說都是一個壞主意,僅僅是因為控制台輸出在相應的控制台流上獲得了監視器鎖. 如果沒有,您將有來自多個線程的部分和混亂的行輸出。

因此,該循環中的控制台輸出具有副作用,使這 4 個線程相互等待以在控制台上輸出消息。 更糟糕的是:監視器鎖是不公平的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM