当前位置: 首页 > 知识库问答 >
问题:

如何使Java线程获得合理的CPU时间

翁和正
2023-03-14

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

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

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

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

>

  • 它产生"Gun is Fired"消息,之后没有消息显示在控制台中。在这种情况下,主线程似乎垄断了CPU。

    有时一个“玩家”对象获得所有的中央处理器时间并赢得比赛,而其他玩家对象都没有获得中央处理器时间。

    很少所有的播放器实例都有相当多的CPU时间,我可以看到每个播放器实例都在控制台中生成消息。

    我的系统中的处理器是Core2Duo。

    有没有可能一直做到上面提到的“第三次输出”?。

    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个答案

    李锦
    2023-03-14

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

    控制台中的每一个线程都在等待另一个消息的输出。更糟糕的是:监视器锁是不公平的。

    葛和志
    2023-03-14

    操作系统试图在线程之间平均分配CPU。我会使用倒计时锁或者类似的方法来代替等待获胜者的循环,因为你的findWinner会和跑步者一起争夺CPU。

     类似资料:
    • 问题内容: 我的Go程序需要知道所有系统和用户进程的当前cpu使用率。 我如何获得? 问题答案: 我遇到了类似的问题,但从未找到轻量级的实现。这是我的解决方案的精简版,可以回答您的特定问题。我按照tylerl的建议对文件进行采样。您会注意到,我在两次采样之间等待3秒以匹配top的输出,但是在1或2秒的情况下我也取得了不错的结果。我在go例程中的循环中运行类似的代码,然后在需要其他go例程时访问cp

    • 问题内容: 我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,例如Spring Batch中的并行步骤。 据我所知,太多的线程无法执行程序的步骤是不好的,这可能会对程序的性能产生负面影响。某些因素可能会导致性能下降(使用共享资源(锁定,同步..)时的上下文切换,竞争条件…(还有其他因素吗?)。 当然,获得理想线程数的最好方法是对我进行实际的程序测试,以调整程序的线程数

    • 问题内容: 想在一个固定的时间内运行一个线程。如果未在该时间内完成,我想杀死它,抛出一些异常或以某种方式处理它。怎么做到呢? 我从该线程 了解到的一种方法是在该线程的run()方法内使用TimerTask。 有没有更好的解决方案呢? 编辑:添加赏金,因为我需要一个更明确的答案。下面给出的ExecutorService代码无法解决我的问题。为什么在执行完某些代码后就进入sleep()-我无法处理这段

    • 我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程

    • 问题内容: 我想用Java解决带有多个线程的数学问题。我的数学问题可以分为多个工作单元,我想通过几个线程来解决。 我不希望有固定数量的线程在工作,而是与CPU核心数量匹配的线程数量。我的问题是,为此我在互联网上找不到简单的教程。我发现的只是带有固定线程的示例。 如何才能做到这一点?你能提供例子吗? 问题答案: 你可以通过使用静态运行时方法,确定提供给Java虚拟机的进程数availableProc

    • 问题内容: 现在我正在研究如何尽快从网站获取数据。为了获得更快的速度,即时通讯正在考虑使用多线程。这是我用来测试多线程和简单文章之间差异的代码。 如您所见,这是一个非常简单的代码。首先,我将模式设置为“ Simple”,然后我可以得到时间间隔: 50s (也许我的速度有点慢:()。然后我将模式设置为“ Multiple”,然后我得到了时间间隔: 35 。从我可以看到,多线程实际上可以提高速度,但是