簡體   English   中英

Java線程-cpu利用率高嗎?

[英]Java threads - High cpu utilization?

我有兩個線程。 我先調用一個( SocketThread ),然后從那個調用另一個線程(“ ProcessThread”)。 我的問題是,在執行期間,CPU使用率為50%。 當我在ProcessThread run方法中添加TimeUnit.NANOSECONDS.sleep(1)時,它減少到0%。 這是正確的修改方法嗎? 或任何有關降低CUP利用率的建議。

下面是我的代碼:

public class SocketThread extends Thread {
    private Set<Object> setSocketOutput = new HashSet<Object>(1, 1);
    private BlockingQueue<Set<Object>> bqSocketOutput;

    ProcessThread pThread;  

    @Override
    public void run() {
        pThread = new ProcessThread(bqSocketOutput);
        pThread.start();
        for(long i=0; i<= 30000; i++) {
            System.out.println("SocketThread - Testing" + i);
        }
    }

}

public class ProcessThread extends Thread {

    public ProcessThread(BlockingQueue<Set<Object>> bqTrace) {
        System.out.println("ProcessThread - Constructor");
    }

    @Override
    public void run() {
        System.out.println("ProcessThread - Exectution");
        while (true) {

            /*
            try {
                TimeUnit.NANOSECONDS.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/
        }
    }
}

您可以通過使線程處於休眠狀態來“降低CPU利用率”,但這意味着您不會在這些線程上完成任何工作(或者,如果這樣做,它的執行速度要比僅讓線程完全運行的速度慢得多)。 這就像說您可以通過停止幾英里並關閉發動機來減少汽車的燃油消耗。

通常,運行while(true)循環而沒有某種形式的阻塞線程同步(如.Wait() ,或者在您的情況下,如@ Martin-James建議的BlockingQueue.take() )是一種代碼味道,並指示應該重構。

如果您的工作線程通過調用take()等待阻塞隊列,則它不應消耗CPU資源。

如果它處於不執行任何操作的緊密循環中(如示例中的代碼所示),那么它當然會消耗資源。 在循環內將sleep稱為限制器可能不是最好的主意。

只要有工作要做,就有兩個緊密的循環會占用CPU。 睡眠是減慢應用程序速度(並降低CPU利用率)的一種方法,但很少有(如果有的話)所需的結果。

如果您堅持要睡覺,則需要將睡眠時間至少增加20毫秒,然后從那里進行調整。 您也可以在完成一系列任務后查看睡眠。 您還需要在SocketThread打印循環中進行類似的睡眠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM