【问题标题】:Android daemon thread testAndroid 守护线程测试
【发布时间】:2013-03-10 15:24:04
【问题描述】:

我正在 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. 为什么 spawn 守护进程的结果是 false,所以守护进程的 spawn 不是这里的守护进程

  2. 为什么在 Android 应用程序退出后守护程序 thead 继续运行?根据 TIJ,JVM 在所有非守护线程被杀死后退出,并且守护线程也退出。那么应用程序销毁后JVM不会关闭吗?谢谢。

【问题讨论】:

  • 我认为您可能必须使用setDaemon(true); 来使它们成为守护进程,这样 isDaemon() 将返回 true 而不是 false。

标签: android multithreading spawn


【解决方案1】:

我无法回答第一个问题。它们也应该是守护进程 (http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ315_005.htm)
对于 Android 目的,守护线程或非守护线程没有实际意义。您的应用进程永远不会退出:它要么保留在后台,要么在某个时候被终止。

您的第二个问题: “...... Android应用程序退出......”是什么意思?应用程序不会“退出”,它们只是进入后台,如果操作系统认为有必要,它们可能会被杀死。

换句话说,当您的应用程序进入后台时,它不会退出。它一直在后台运行(直到它在某个时候被杀死)。

【讨论】:

  • “Android 应用程序退出”意味着我退出了一个应用程序并且主 Activity 被销毁。
  • 谢谢!那么每个 App 都有 JVM 吗?
  • 视情况而定,但一般来说:是的。
  • 这取决于您应用的设计。您可以共享您的应用程序的活动(通过 Intents 等)并且它们可以在另一个人的进程上运行(不太可能);您的应用的活动可以在多个进程上运行(使用 android:process 属性);您的应用程序在其自己的进程中运行(最常见)。这意味着最常见的情况是每个应用程序在自己的进程中运行,使用自己的 DalvikVM。
  • 不要过度使用 android:process 属性。你应该有一个非常好的理由来使用这个属性,甚至还有一个更好的理由说明为什么 not 使用这个属性是行不通的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多