资讯专栏INFORMATION COLUMN

Android Thread 官方说明

leo108 / 868人阅读

摘要:官方说明是程序中执行的线程。虚拟机允许应用程序同时运行多个执行线程。优先级别高的线程优先于优先级别低的线程执行。所有非守护线程已经退出,或者通过调用方法返回或通过抛出一个方法的异常。

Thread官方说明

https://developer.android.google.cn/reference/java/lang/Thread

Thread是程序中执行的线程。Java虚拟机允许应用程序同时运行多个执行线程。


每个线程都可设置优先级别。优先级别高的线程优先于优先级别低的线程执行。线程可能是守护进程(Daemon),也可能是非守护进程(Non-daemon)。当在某个线程的代码中创建一个新的Thread对象时,新线程的优先级初始设置等于创建线程的优先级,并且当且仅当创建线程是守护进程时新的Thread才是守护进程线程。


当Java虚拟机启动时,通常会有一个非守护线程(通常会调用某个指定类的main方法)。Java虚拟机将继续执行线程,直到出现以下任一情况:

  • Runtime类的exit方法已经被调用并且安全管理器允许退出操作发生。
  • 所有非守护线程已经退出,或者通过调用run方法返回或通过抛出一个run方法的异常。

 

有两种方法可以创建一个新的执行线程。一种是将一个类声明为Thread的子类。这个子类应该重写Thread类的run方法。然后可以分配和启动子类的一个实例。例如,计算大于某个值的素数的线程:

 

class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
         . . .
    }
}

 

下面的代码会创建一个线程并执行:

PrimeThread p = new PrimeThread(143);
p.start();

 

另一种创建线程的方式是声明一个实现了Runnable接口的类,然后实现了run方法。 然后可以分配一个类的实例,在创建线程时作为参数传递,然后启动线程。 示例如下:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

 

下面的代码会创建一个线程并开始执行:

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

 

每个线程都有一个用于标识的名称。 多个线程可能具有相同的名称。 如果在创建线程时未指定名称,则系统会自动为其生成新名称。除非另有说明,否则将null参数传递给此类中的构造函数或方法将导致抛出NullPointerException。

守护线程(daemon)和用户线程(User Thread)

所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程 。Daemon thread在Java里面的定义是,如果虚拟机中只有Daemon thread 在运行,则虚拟机退出。通常Daemon线程用来为User线程提供某些服务。程序的main()方法线程是一个User线程,User线程创建的线程为User线程。当所有的Non-daemon线程结束后,JVM才会结束。

 

通过在一个线程对象上调用setDaemon(true),可以将user线程创建的线程明确地设置成Daemon线程。例如,时钟处理线程、idle线程、垃圾回收线程、屏幕更新线程等,都是Daemon线程。通常新创建的线程会从创建它的线程哪里继承daemon状态,除非明确地在线程对象上调用setDaemon方法来改变daemon状态。


需要注意的是,setDaemon()方法必须在调用线程的start()方法之前调用。一旦一个线程开始执行(如,调用了start()方法),它的daemon状态不能再修改。通过方法isDaemon()可以知道一个线程是否Daemon线程。


总之,必须等所有的Non-daemon线程都运行结束了,只剩下daemon的时候,JVM才会停下来,注意Main主程序是Non-daemon线程,默认产生的线程全部是Non-daemon线程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/3102.html

相关文章

  • Android Handler、Message、MessageQueue和Looper官方说明

    摘要:官方说明官方文档允许您发送和处理与线程的关联的和对象。同样的,在创建的线程中通过或方法来将消息添加到消息队列,并在适当的时候处理。官方说明官方文档类用于运行线程的消息循环。Handler官方说明 官方API文档:https://developer.android.google.cn/reference/android/os/Handler Handler允许您发送和处理与线程的Message...

    enali 评论0 收藏0
  • Eventbus3.0的使用

    摘要:主要是用来在各个组件之间进行消息传递的。一般在或销毁的时候注销。来对事件进行处理。没有对函数的命进行规定。在发布消息调用函数的线程的线程中执行。取消事件分发在某些情况下,我们不想让事件被继续分发了。 原文地址: http://blog.magicer.xyz/2017/... 简介 EventBus是http://greenrobot.org/出的一个发布者/订阅者(Publisher...

    MiracleWong 评论0 收藏0
  • 解读Android官方开发指导 - 运行时权限

    摘要:权限申请官方开发指导上使用在中已经申明的危险权限时需要用户授权。下面结合官方的开发指导对这几个做下说明。检查是否已经具有了相关权限。如,和权限就是属于组的。分门别类不仅仅是为了方便容易阅读,组内权限在申请上也是有关联的。 showImg(https://segmentfault.com/img/remote/1460000006962053); 系统权限简介 Android出于系统稳定...

    stackvoid 评论0 收藏0
  • Android之Service

    摘要:优点默认的处理所有来自收到的请求。依次传递收到到,依次处理。若想得到的返回结果,可用携带一个对象,这样在使用完成后,即可发送发送广播。当不再需要,需要调用进行解绑,使得服务科正常关闭。可使用,但不会停止。 startService(): run indefinetly, 需要在适当时候stopSelf() onBind(): 提供一个CS模式的服务,runs as long as t...

    longmon 评论0 收藏0
  • 2017 Android 面试题 [ 基础与细节 ]

    摘要:操作完成后,服务会自行停止运行。创建工作队列,用于将逐一传递给实现,这样您就永远不必担心多线程问题。是的消息机制,集中解决线程间通信问题。 2017 Android 面试题 [ 基础与细节 ] 感谢@chuyao抛出的这些问题,平时业务代码写多了,很多基础的东西变得含糊不清了,这次裸辞出来找工作确实没有之前顺利,顺便求上海Android开发的坑。我自己整理了些答案,不对或者不妥的地方请...

    mtunique 评论0 收藏0

发表评论

0条评论

leo108

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<