TIDの優先度について

696 views
Skip to first unread message

karamu

unread,
Jan 21, 2014, 11:37:08 PM1/21/14
to android-g...@googlegroups.com
DDMSのスレッドに表示されている名前からTIDをソース上で取得することは可能でしょうか?
また、そのTIDを指定して、
android.os.Process.setThreadPriority()を使ってプライオリティを変更を実施することは問題ないのでしょうか?

Naoyasu Suzuki

unread,
Jan 22, 2014, 3:21:13 AM1/22/14
to android-g...@googlegroups.com
すずきです。

・TID取得
デバッグ用途ですと
psコマンドなどのソースコードを書き換えて、
Runtime.getRuntime().exec("ps ");
出力された結果から、ThreadName を検索し、TID取得する。
※Rootとっている端末しか出来ないですね^^;

・プライオリティ変更
アプリの方は、android.os.Process.setThreadPriority()を使って
プライオリティを変更する事は可能ですし問題もありません。
同じアプリケーション内の他のスレッドより優先度を上げたい場合は有効です。
ただ、処理を早くまわしたい場合は、気休め程度しか早くならないです。

2014年1月22日水曜日 13時37分08秒 UTC+9 karamu:
DDMSのスレッドに表示されている名前からTIDをソース上で取得することは可能でしょうか?
また、そのTIDを指定して、
android.os.Process.setThreadPriority()を使ってプライオリティを変更を実施することは問題ないのでしょうか?

karamu

unread,
Jan 22, 2014, 10:35:58 PM1/22/14
to android-g...@googlegroups.com
鈴木様
 
そうですか・・・ROOT&PSコマンドを使用しないとわからないのですね。
DDMSなどに表示されていたので、ActivityManagerとかみたいにスレッドの管理しているクラスとかで
該当のスレッドを発見してTIDを取得!などができないかなぁと考えていました。 
ありがとうございました。

Shigeo Mutoh

unread,
Jan 22, 2014, 11:34:37 PM1/22/14
to android-g...@googlegroups.com
武藤です。

以前に書いたコードでTIDは取れたはずと思って探してみたところ、
以下のように書いてました。

// thread idは, Thread.getId()じゃ違う値がとれるよ。
long tid = android.os.Process.myTid();

で、コメントにあるように、Thread.getId()はTIDではないみたいですから、
thread priorityを変更する場合には、どちらのidを使用するのかは私は
知らないので調査してみてください。

では。

karamu

unread,
Jan 23, 2014, 1:06:56 AM1/23/14
to android-g...@googlegroups.com
TM様
 
コメントありがとうございます
 
        int tid = android.os.Process.myTid();(※1)
        Log.i(TAG, "tid"+Integer.toString(tid));

        int pri = android.os.Process.getThreadPriority (tid);(※2)
        Log.i(TAG, "pri "+Integer.toString(pri ));

        android.os.Process.setThreadPriority (android.os.Process.THREAD_PRIORITY_FOREGROUND); (※3)
 
 
※1で取得できたTIDはLogcatなどに出てくるTIDと一致していました。
※3で設定したあと更にさらに※2をよぶと、ThreadPriorityが変更していた値になっていたので
thread priorityを変更する場合にはmyTid()の値でいいのではと考えています。
 
ただ、今回、変えたいスレッドが、myTid()ではなく、
スレッド名から該当のTIDを取得したいと考えていたので行き詰ってしまいました。
 
 
 

Shigeo Mutoh

unread,
Jan 23, 2014, 3:08:08 AM1/23/14
to android-g...@googlegroups.com
武藤です。

Thread.currentThread().getName()
で自スレッドの名前は取れますが、それではスレッドごとに「仕込み」を
入れないとならず、困るのですよね。

Map<Thread, StackTraceElement[]> java.lang.Thread.getAllStackTraces()

などという粗暴なapiも存在しますので、このMapをイテレートすれば全スレッド
を得られるかなと。たぶんstop worldします。
ただ、あまりに乱暴なので、もうちょっと子マシな方法を見つけるか、
getAllStackTraces()の中を見て、より良いものを作った方が良いと思います。

では。

karamu

unread,
Jan 23, 2014, 4:44:12 AM1/23/14
to android-g...@googlegroups.com
武藤様
 

java.lang.Thread.getAllStackTraces()
なるものがあるのですね。
TIDが取得できるかも含め、確認してみます!
情報ありがとうございます。

karamu

unread,
Jan 29, 2014, 2:25:03 AM1/29/14
to android-g...@googlegroups.com
 ひとまず、getAllStackTracesを使用してTID 
が取得できないかとかくにんしてみました。
★箇所でブレイクを張ってthreadを確認してみたのですが
TIDらしいものが見つからず、 thread.getId();で取得した値も
DDMS上にみられるTIDでもIDでもありませんでした・・・。
 
ただ、thread.setPriority()で優先度は設定変更可能のようなのですが、
このパラメータである優先度の範囲は 優先度低:1~10:優先度高
android.os.Process.setThreadPriority()で指定できる範囲は下記のような記載があり、
優先度低:19~-20:優先度高であると思うのですが、
priority

A Linux priority level, from -20 for highest scheduling priority to 19 for lowest scheduling priority

スレッドとひとくくりに言ってもUIスレッドで優先度の設定などは異なるのでしょうか
 
   Map<Thread, StackTraceElement[]> maps = Thread.getAllStackTraces();
        Iterator<Entry<Thread, StackTraceElement[]>> itr = maps.entrySet().iterator();
        while(itr.hasNext()){
            Map.Entry entry = (Entry) itr.next();
            Thread thread = (Thread) entry.getKey();
            if(thread.getName().equals("スレッド名")){
             long id = thread.getId();★
             int pri = thread.getPriority();
             thread.setPriority(Thread.MAX_PRIORITY);
             break;
             
            }
}
 
Reply all
Reply to author
Forward
0 new messages