繁体   English   中英

Java线程和高CPU使用率

[英]Java Threads and high cpu usage

我在这里做了一些搜索,找不到答案,所以我认为最好问一下。 我正在一个简单的Java swing应用程序中运行一些昂贵的算法。 让我描述一下结构:

在我的JPanel run()方法中:

public void run() {
    while(true) {
        Algorithm alg = new Algorithm(signal);
        new Thread(alg).start();

        //Wait for algorithm to finish 
        signal.await(alg);

        updateInterface();

        Thread.sleep(60L);
    }
}

算法循环遍历.JPG文件的像素,然后循环遍历另一个较大的Integer数组(长度〜12000)并返回。 没有非常昂贵的计算槽。 我也在算法run()方法中调用Thread.sleep(60L)

udpateInterface()方法非常快,只需绘制一些java.awt.Polygon对象即可。

即使我调用Thread.sleep(60L) ,我的Mac Book(2.4 GHz Intel Core 2 Duo,Mem 4GB 1067)上的CPU使用Thread.sleep(60L)约为160%。

有没有一种方法可以在不熔化计算机的情况下运行它? 我正在使用CountDownLatch作为等待通知机制。

谢谢!

我将使用以下模式来安排重复任务。

private ScheduledExecutorService executorService = null;

public void start() {
    if (executorService != null && !executorService.isShutdown()) return;

    executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                Algorithm alg = new Algorithm(signal);
                alg.run();
                updateInterface();
            }
        }, 0, 60, TimeUnit.MILLISECONDS);
}

public void stop() {
    if (executorService != null)
        executorService.shutdown();
}

160%的CPU使用率是相对于计算机的单个核心而言的,也就是说,由于计算机具有两个核心,因此计算机上的最大可能使用率为200%。 您并没有融化处理器。

如果您随后要做的就是让当前线程等待另一个线程完成,那么启动另一个线程是没有意义的。 您最好只在已有的线程中运行算法。 无论哪种方式,在算法完成之前,您都不会继续进行updateInterface()的操作。

正如其他人指出的那样,算法完成并更新UI后,您只需要等待60毫秒,即可再次启动算法。 听起来您的程序正在花费大部分时间来运行算法。 如果您需要它来快速更新屏幕,那很好,但是您可能会考虑使用更长的延迟。

另外,您每次都要在循环中启动一个新线程。 该线程运行一次算法然后终止,还是在循环中运行算法? 如果您有一个循环启动线程,每个线程都是长时间运行的CPU密集型循环,则您可能会意外地一次运行该算法的许多副本。 如果您希望算法线程在发出信号后终止,则应使用join()进行确认。

您要等待多少时间? 如果要等待60秒,则应使用60000L,因为指定的时间以毫秒为单位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM