私は Java ベースのアプリ (Android) を持っており、バックグラウンドで潜在的に長い操作を実行できるようにしたいと考えています。AsyncTask の Android ドキュメントでは、数秒以上実行される可能性のあるタスクにそれらを使用しないようにアドバイスしているため (これはなぜですか?)、代わりに Java の Thread のサブクラスを使用しています。この Thread サブクラス (HPCHeadThread) の目的は、主に、いくつかの非同期制御メカニズムのインスタンスをホストし、他のスレッドが使用するメカニズムへのアクセサー メソッドを提供することです。私が目指しているワークフローは、HPCHeadThread への参照を使用して任意のスレッドから hHPCHeadThread.doStuff() を呼び出すことができ、HPCHeadThread でインスタンス化されたコントロール オブジェクトが HPCHeadThread スレッドでのみそのスレッドで動作するようにすることです。別のスレッドからアクセスされていない場合、HPCHeadThread は CPU サイクルを浪費しないようにスリープする必要があります。
TestActivity.java
//..snip
private HPCHeadThread hHPCHeadThread;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//...snip
//Create and start our HPCHeadThread
hHPCHeadThread = HPCHeadThread.getHPCThreadHead();
hHPCHeadThread.start();
//..snip
}
HPCHeadThread.java
//..snip
public class HPCHeadThread extends Thread {
private static volatile HPCHeadThread instance;
private static boolean bIsActive = true;
private HPCHeadThread(){
super();
}
public static HPCHeadThread getHPCThreadHead(){
if(instance == null && bIsActive){
instance = new HPCHeadThread();
}
return instance;
}
public void safeStop(){
instance = null;
bIsActive = false;
}
@Override
public void run(){
Thread thisThread = Thread.currentThread();
Thread.currentThread().setName("HPC_Head_Thread");
while(instance == thisThread){
//Our HPCHeadThread 'main' loop
//Try to have it sleep whenever it isn't being used
//Hopefully it will wake nicely upon attempted access,
//perform the desired function, and then return to sleep
try{
Thread.sleep(10000);
}
catch (InterruptedException e){
//e.printStackTrace();
}
}//End while
}//End Run()
public void doStuff(){
//..snip stuff..
}
}
ここで、メインの TestActivity スレッド内から hHPCHeadThread.doStuff() を呼び出した場合、作業は HPCHeadThread またはメインの TestActivity スレッドで処理されますか? TestActivity は、独自のスレッド内で順次実行を続行する前に、doStuff() メソッドが戻るのを待ちますか? メソッド呼び出しは、HPCHeadThread をウェイクアップしますか、および/またはループ中に HPCHeadThread の run() メソッドで InterruptedException をスローしますか?