簡體   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