2012-02-06 37 views
0

你好我在android 這樣一個聊天應用程序,總的來說,我有一個包含很多類和線程的服務。 在我的服務中,我有套接字輸入讀取類,套接字輸出寫入器類和pinger,總結有6個線程。爲什麼我的android項目將CPU使用率從60%提高到100%?

其實,我對這個問題很新,我可以說我不知道​​是什麼讓一個程序佔據CPU進程的高比例。是否會導致太多的靜態變量?或者運行的線程太多,或者太多的局部變量可能?

我不知道到底發生了什麼......?

所以,請與我分享你的經驗和知識

UPDATE

public void run() { 
     while(isRunning) { 
      try { 
       Thread.sleep(500); 
       if(!startCheck) { 
        //Log.v(TAG, "SocketQueue: "+socketTaskQueue.size() 
        if(socketTaskQueue.size() > 0) { 
         processSocketTask();// TODO 
        } 

       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

所以基本上,我做了我喜歡的線程上面的例子。 所以,我有一個名爲socketTaskQueue的向量,並且此線程作業的目的是檢查是否存在套接字任務。如果是這樣,那麼它將執行processSocketTask函數,該函數將獲得向量隊列的頂層元素,然後將其刪除。

UPDATE

T.T這個職位是尷尬!我忘記把Thread.sleep()放在我的一些線程中! 抱歉讓您擁有! :p

+0

**它可能是任何真的......誰知道你的程序中有什麼,*當然我不知道!***有一件事是肯定的,太多的靜態或局部變量不會導致你的CPU用法上升。唯一會導致CPU使用率上升的是代碼執行(來自單個或多個線程)。 – Kiril 2012-02-06 07:30:35

+0

嗨,我已經插入了我的代碼...基本上,我運行了所有這樣的6個蘇打。這種線程是否會讓CPU耗盡?請給我更多的線索...... – user724861 2012-02-06 07:59:43

+0

每最後一次更新:'Thread.Sleep()'可能是實現你想要的最不優雅的方法之一。它幾乎總是一個糟糕的代碼氣味,你應該避免使用它。對於你的例子,你應該使用某種計劃任務/計時器。 – Kiril 2012-02-06 14:44:53

回答

0

這通常是由使用CPU的線程引起的,即使它們無法完成有用的工作。例如,當一個線程正在等待某些事情發生時,它是否以不使用CPU的方式等待?還是在它能夠工作之前不停地醒來?

它也可能是由以非常低效的方式工作的線程引起的。

+0

實際上,所有這6個線程都保持運行,無論他們是否有工作或沒有工作。你是這個意思嗎?線程效率低下? – user724861 2012-02-06 07:38:42

+0

是的,正好。當一個線程沒有任何有用的工作要做時,它不應該準備好運行,而應該被阻塞*等待它可以做有用的工作。 – 2012-02-06 07:39:13

+0

嗨,請看我的更新。它顯示我通常如何運行一個線程......好吧,我只是好奇地阻塞線程。所以請告訴我如何做到這一點:p – user724861 2012-02-06 07:57:34