2016-09-08 10 views
0
public class MainActivity extends Activity { 

private int newThreadCount; 
private int uiCount; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Thread t = new Thread() { 
     @Override 
     public void run() { 
      //Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 
      while (true) { 
       newThreadCount++; 
      } 
     } 
    }; 
    t.start(); 
    while (uiCount < 100000000) { 
     uiCount++; 
    } 
    Log.d("TEST", "uiCount=" + uiCount + " newThreadCount=" + newThreadCount); 
} 

私が知っている Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)bg_non_interactiveのcgroupAndroidのスレッドProcess.setThreadPriority

  1. 実行上記のコードで

    LETスレッドTの実行、ログ印刷uiCount = 100000000およびnewThreadCount = 50000000(around)

  2. Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)を削除してから コードを再度実行してください。ログの印刷はほぼ同じです。

したがって、Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)の機能は何ですか?

+0

正確に何を求めていますか?あなたの質問の文書化答えはどうですか? – JoxTraex

+0

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)またはProcess.setThreadPriority(Process.THREAD_PRIORITY_FORCEGROUND)のスレッドがCPUの時間を占有しますか? – iceGeneral

+0

あなたのメインポストに更なるアップデートをアップデートしてください。コメントにそれらを残さないでください。 – JoxTraex

答えて

1

Android APIはすでにワーカースレッドにバックグラウンド優先度を割り当てています(たとえば、HandlerThreadとAsyncTaskのソースコードを参照)。

ただし、必ずしもそうであるとは限りません。たとえば、メインのUIスレッドでインスタンス化されたスレッドおよびExecutorServicesは、デフォルトのフォアグラウンド優先度を継承し、遅延を起こしやすく、アプリケーションのパフォーマンスを損なう可能性があります。このような場合、スレッドが実行される前に、Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)を呼び出して、スレッドの優先順位を常に設定することを忘れないでください。以下の例に示すように、これは簡単です。

new Thread(new Runnable() { 
    @Override 
    public void run() { 
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 

    // ... 
    } 
}).start();