如何使Java线程获得相当多的CPU时间

时间:2014-01-20 19:38:42

标签: java multithreading

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

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

我的目的是让4名选手参加100米跑比赛。 Main正在以最高优先级运行线程,因此它可以检查每个玩家的进度。我在主线程和子线程中编写了Yield方法,认为主线程和子线程都会获得相当多的CPU时间。

此程序为每次运行生成以下三种不同的输出。

  1. 它产生“”枪被发射“消息,之后控制台中没有显示任何消息。在这种情况下,主线程看起来像是垄断了CPU。

  2. 有时候,一个“Player”对象获得所有CPU时间并赢得比赛,其他玩家对象都没有获得CPU时间。

  3. 很少所有玩家实例获得相当多的CPU时间,我可以看到每个玩家实例都在控制台中生成消息。

  4. 我系统中的处理器是核心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;                    
                    } 
                }
            }
    
        }
    }
    

2 个答案:

答案 0 :(得分:3)

操作系统尝试在线程中平均分配CPU。 而不是循环等待获胜者,我会使用CountDownLatch或类似的东西,因为你的findWinner与跑步者一起竞争CPU。

答案 1 :(得分:0)

7 年后看到这个的任何人,在忙循环中的任何地方使用 System.{out|err}.println() 对这种“测量”来说是一个坏主意,因为控制台输出获取监视器上的锁相应的控制台流。如果没有,您将有来自多个线程的部分和混乱的行输出。

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