博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Thread 官方说明
阅读量:4677 次
发布时间:2019-06-09

本文共 1957 字,大约阅读时间需要 6 分钟。

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.cnblogs.com/elvischiu/p/8976234.html

你可能感兴趣的文章
17第一发之蓝桥暴力思维(特殊回文)
查看>>
webapp开发时问题2-选点子和选创意与坚持
查看>>
uva11806cheerleaders容斥原理,二进制
查看>>
Android核心分析之二十四Android GDI之显示缓冲管理
查看>>
~(取反操作符)的探索
查看>>
C++学习随笔之八:抽象与建模----类的设计技术
查看>>
博客系列
查看>>
会放弃的人生才会更洒脱
查看>>
C# 非模式窗体show()和模式窗体showdialog()的区别(转)
查看>>
dubbo 使用 filter 报错解决
查看>>
一些宏
查看>>
NOIP2018:The First Step
查看>>
MYI 文件内容
查看>>
vim中注释多行python代码
查看>>
asp.net获取当前网址url【转】
查看>>
Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
查看>>
php报错 Call to undefined function mb_stripos()
查看>>
学习笔记11之多对多查询
查看>>
“逻辑与”规则的最新认识
查看>>
asp.net mvc网站的发布与IIS配置
查看>>