1

私はAndroidで次のようなJavaのマルチスレッドでThinkをテストしています。

private void testDeamon(){

    Thread d = new Daemon();
    System.out.println(
            "d.isDaemon() = " + d.isDaemon());


    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


public class Daemon extends Thread {
    private static final int SIZE = 10;
    private static final String TAG = null;
    private int i = 9000;

    private Thread[] t = new Thread[SIZE];
    public Daemon() { 
        setDaemon(true);
        start();
    }
    public void run() {
        for(int i = 0; i < SIZE; i++)
            t[i] = new DaemonSpawn(i);
        for(int i = 0; i < SIZE; i++)
            System.out.println(
                    "t[" + i + "].isDaemon() = " 
                            + t[i].isDaemon());
        while(true) {
            Log.d(TAG, "Deamon running..."+ i--);
            if (i==0) 
                break;

            yield();
        }
    }

    class DaemonSpawn extends Thread {
        public DaemonSpawn(int i) {
            System.out.println(
                    "DaemonSpawn " + i + " started");
            start();
        }
        public void run() {
            while(true) 
                yield();
        }
    }
}
  1. スポーンデーモンの結果がfalseである理由、デーモンのスポーンはここではデーモンではありません

  2. Androidアプリケーションの終了後もデーモンシードが実行され続けるのはなぜですか?TIJによると、すべての非デーモンスレッドが強制終了された後、JVMが終了し、デーモンスレッドも終了します。では、アプリケーションが破棄された後、JVMはシャットダウンされませんか?ありがとう。

4

1 に答える 1

3

最初の質問には答えられません。それらもデーモンである必要があります(http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ315_005.htm)Android
目的では、デーモンスレッドまたは非デーモンスレッドは重要ではありません。アプリのプロセスが終了することはありません。バックグラウンドに残るか、ある時点で強制終了されます。

2番目の質問:「... Androidアプリケーションの終了...」とはどういう意味ですか?アプリは「終了」せず、バックグラウンドに入るだけで、OSが必要と判断した場合、アプリが強制終了される可能性があります。

つまり、アプリがバックグラウンドに移行しても、終了しません。バックグラウンドで実行され続けます(ある時点で強制終了されるまで)。

于 2013-03-10T15:33:55.670 に答える