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

标签 java multithreading

我是 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。

关于java - 如何使 Java 线程获得相当数量的 CPU 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242664/

相关文章:

java - Amazon SWF 初学者 - 如何开始执行一个工作流程循环

java - 将 ID 从查询转换为字符串

c# - 如何同步线程中的 2 个进程以便它们一起运行?

c++ - Qt 库中的 GUI 线程检测

c++ - const 对象的无锁重载和共享

c++ - WxWidgets 应用程序运行失败

c# - 内存中的方法表示是什么?

java - ApachePoi 在 OpenJdk 1.8.0_121 上因字体错误而失败 在 Oracle Jre 上没问题

java - JSON 数据已加载,但不会显示在我的应用程序中

c - 具有结构数组的线程返回 SIGSEGV (段错误错误)?