Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个简单的小程序使用up>;50%的CPU?_Java_Applet_Cpu - Fatal编程技术网

Java 为什么这个简单的小程序使用up>;50%的CPU?

Java 为什么这个简单的小程序使用up>;50%的CPU?,java,applet,cpu,Java,Applet,Cpu,我写了一个简单的小程序作为制作游戏的基础,它已经占用了我超过50%的CPU。我使用的是3ghz P4,内存为1.5gb,所以我知道它不应该占用那么多空间 import java.awt.*; import java.applet.*; public class applettest extends Applet implements Runnable { long lastFrame; public void init() { (new Thread(th

我写了一个简单的小程序作为制作游戏的基础,它已经占用了我超过50%的CPU。我使用的是3ghz P4,内存为1.5gb,所以我知道它不应该占用那么多空间

import java.awt.*;
import java.applet.*;

public class applettest extends Applet implements Runnable {

    long lastFrame;

    public void init() { 
        (new Thread(this)).start();
    }

    public void paint(Graphics g) {
        g.drawString("Welcome to Java!!", 50, 60 ); 
    }

    public void run() { 
        while(true) {
            // code here
            repaint();

            try{
                // wait 16 milliseconds to cap frame rate to 60 fps
                while (System.nanoTime() < lastFrame + 160000000)       {
                    Thread.yield();
                }

                lastFrame = System.nanoTime();
            }

            catch(Exception e){}
        }
    }
}
import java.awt.*;
导入java.applet.*;
公共类applettest扩展Applet实现可运行{
长框架;
public void init(){
(新线程(此)).start();
}
公共空间涂料(图g){
g、 抽绳(“欢迎来到爪哇!!”,50,60);
}
public void run(){
while(true){
//代码在这里
重新油漆();
试一试{
//等待16毫秒,将帧速率限制为60 fps
而(System.nanoTime()
尝试用替换

这将保证帧之间的时间至少为16ms。如果渲染时间小于16ms,并且没有任何其他线程占用CPU,则渲染时间将以60fps的速度运行

您最初的解决方案将强制执行16ms最小值,但它必须反复保持系统时间(使用CPU),直到经过必要的时间

注意事项:

  • repaint()
    是一个异步调用(即)
试着用

这将保证帧之间的时间至少为16ms。如果渲染时间小于16ms,并且没有任何其他线程占用CPU,则渲染时间将以60fps的速度运行

您最初的解决方案将强制执行16ms最小值,但它必须反复保持系统时间(使用CPU),直到经过必要的时间

注意事项:

  • repaint()
    是一个异步调用(即)

    • 由于java没有使用CPU的第二个核心,您可能只看到了50%

      您的代码将尽可能快地完成加法和比较

      // wait 16 milliseconds to cap frame rate to 60 fps
      while (System.nanoTime() < lastFrame + 16000000)        {
        Thread.yield();
      }
      
      //等待16毫秒,将帧速率限制为60 fps
      而(System.nanoTime()

      使用Thread.sleep(16)而不是紧密的while循环进行大量的数学运算。

      由于java没有使用CPU的第二个核心,您可能只看到了50%

      您的代码将尽可能快地完成加法和比较

      // wait 16 milliseconds to cap frame rate to 60 fps
      while (System.nanoTime() < lastFrame + 16000000)        {
        Thread.yield();
      }
      
      //等待16毫秒,将帧速率限制为60 fps
      而(System.nanoTime()

      使用Thread.sleep(16)而不是紧密的while循环和大量的数学运算。

      您正在忙着等待,直到时间达到某个阈值。但是,如果没有其他线程需要时间,屈服并不意味着线程停止运行


      如果你想等待并减少CPU的使用,考虑线程。睡眠

      < p>你正在忙着等待,直到时间达到某个阈值。但是,如果没有其他线程需要时间,屈服并不意味着线程停止运行


      如果你想等待并减少CPU的使用,考虑线程。睡眠< /P> < P>注意1600000毫微秒=1.6毫秒,所以你可能没有按照你预期的那样长时间睡觉。

      < P>注意1600000毫微秒=1.6毫秒,因此,您可能没有按预期的时间睡眠。

      Thread.sleep和繁忙等待之间的区别在于,当您将线程置于睡眠状态时,您告诉计算机在x秒内不需要做任何事情,而pc会让其他进程使用该时间


      然而,在繁忙的等待中,您告诉您的机器不断运行循环代码,即使它没有真正完成任何事情。

      Thread.sleep和繁忙等待之间的区别在于,当你让线程进入睡眠状态时,你告诉计算机在x秒内你不需要做任何事情,而pc会让其他进程使用这段时间


      然而,在忙碌的等待中,你告诉你的机器不断地运行循环代码,即使它没有真正完成任何事情。

      很抱歉,这篇文章更多地是“和更多信息…”类型,而不是直接回答,我认为现在已经给出了答案——我只是认为在注释中不要丢失东西是有帮助的

      这个线程似乎显示了对诸如thread.sleep()和thread.yield()之类的方法实际做什么的许多误解(公认是典型的)。我以前写过一些人们可能会感兴趣的材料,我试图澄清其中的一些问题:(包括不同负荷水平下的行为图表),而且——尽管这里没有提到,但相关的是,人们可能会对我的观点感兴趣


      顺便说一句,在这种情况下,使用System.nanoTime()通常没有任何好处:在任何情况下,您只需将时间四舍五入到最接近的毫秒。我会让你省去检索纳秒时钟时间的笨拙计算和潜在开销(尽管后者也不是那么糟糕),只需使用好的ole传统系统。currentTimeMillis()。如果你的帖子睡过头了,下次就少睡一会儿吧。

      很抱歉,这篇帖子更多的是“和更多信息…”类型,而不是直接回答,我想现在已经给出了答案——我只是觉得在评论中不要把东西弄丢是有帮助的

      这个线程似乎显示了对诸如thread.sleep()和thread.yield()之类的方法实际做什么的许多误解(公认是典型的)。我以前写过一些人们可能会感兴趣的材料,我试图澄清其中的一些问题:(包括不同负荷水平下的行为图表),而且——尽管这里没有提到,但相关的是,人们可能会对我的观点感兴趣

      顺便说一句