33881270 发表于 2006-4-18 05:46:00

android 设置线程的优先级

有两处API可以设置线程的优先级:

(1)android.os.Process.setThreadPriority (int priority)

android.os.Process.setThreadPriority (int tid, int priority)

priority:【-20, 19】,高优先级 -> 低优先级。

(2)java.lang.Thread.setPriority (int priority)

priority:【1, 10】,低优先级 -> 高优先级。

测试后发现,使用android自己的API(第1种方法)设置的优先级,对线程调度影响显著。

=====================
测试代码如下:
=====================
package com.test.testx;

import android.app.Activity;
import android.os.Bundle;
import android.os.Process;
import android.util.Log;

public class TestThreadPriority extends Activity {
    private static final String TAG ="TestThreadPriority";

    private boolean mNeedExit = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      MyThread a = new MyThread("Thread A");
      a.setOSPriority(Process.THREAD_PRIORITY_LOWEST); // 19
      a.setPriority(Thread.MAX_PRIORITY); // 10

      MyThread b = new MyThread("Thread B");
      b.setOSPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); // -19
      b.setPriority(Thread.MIN_PRIORITY); // 1

      a.start();
      b.start();
    }

    @Override
    public void onBackPressed() {
      mNeedExit = true;
      super.onBackPressed();
    }

    private class MyThread extends Thread {
      private int mOSPriority = Process.THREAD_PRIORITY_DEFAULT;
      private int mLoopCount = 0;

   public MyThread(String threadName) {
            super(threadName);
   }

   public void setOSPriority(int p) {
            mOSPriority = p;
   }

    @Override
    public void run() {
      Process.setThreadPriority(mOSPriority);

      while(!mNeedExit) {
            mLoopCount ++;
            Math.log(Math.random() * 1000); // calculation test

            Log.d(TAG, new StringBuilder().append(getName())
                  .append(" os priority: ").append(mOSPriority)
                  .append(" java priority: ").append(getPriority())
                  .append(" loop count: ").append(mLoopCount).toString());
            }

            Log.d(TAG, new StringBuilder().append(getName()).append(" exiting...")
                  .append(" os priority: ").append(mOSPriority)
                  .append(" java priority: ").append(getPriority())
                  .append(" loop count: ").append(mLoopCount).toString());
      }
    }
}

33881270 发表于 2006-4-20 04:06:00

点赞了,谢谢楼主发布啊

音频应用 发表于 2006-4-20 04:18:00

分享了,谢谢楼主发布啊

centian 发表于 2006-4-20 05:28:00

支持!

icon 发表于 2006-4-20 07:03:00

支持一下!
页: [1]
查看完整版本: android 设置线程的优先级