首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使Java线程获得相当数量的CPU时间

如何使Java线程获得相当数量的CPU时间
EN

Stack Overflow用户
提问于 2014-01-20 19:38:42
回答 2查看 434关注 0票数 4

我对Java很陌生。在发布这个问题之前,我已经搜索了这个网站。如果我的问题看起来很蠢,请原谅我。

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

我的目的是让4名球员参加100米赛跑。主要是线程是以最高优先级运行的,因此它可以检查每个玩家的进展有多远。我在主线程和子线程中都编写了生成方法,认为主线程和子线程都会得到相当多的CPU时间。

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

  1. 它生成“Gun被触发”消息,之后控制台中没有显示任何消息。看起来,在这种情况下,主线程正在垄断CPU。
  2. 有时候,一个" player“对象获得所有的CPU时间并赢得比赛,而其他的player对象没有一个获得CPU时间。
  3. 很少情况下,所有的播放器实例都会得到相当多的CPU时间,我可以看到每个播放器实例都会在控制台中生成消息。

我的系统中的处理器是核心2双。

能否始终达到上述“第三输出”?

代码语言:javascript
运行
复制
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;                    
                } 
            }
        }

    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-01-20 19:53:11

操作系统试图在线程之间平均分配CPU。而不是循环等待赢家,我会使用CountDownLatch或类似的东西,因为您的findWinner是竞争的CPU与跑步者。

票数 3
EN

Stack Overflow用户

发布于 2021-02-09 06:24:30

任何在7年后使用System.{ output }.println()的人在繁忙循环中的任何地方都是这种“测量”的坏主意,仅仅是因为控制台输出在相应的控制台流上获得了一个监视器锁。如果没有,则会从多个线程输出部分和杂乱的行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21242664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档