写点什么

聊聊 Java 中的 Thread 类

用户头像
geekymv
关注
发布于: 2020 年 06 月 10 日

Thread类是位于java.lang包下,java.lang包是系统自动隐式导入的,也就是说开发人员无需用import语句导入就可以使用其中的类。



thread是程序中的执行线程,Java虚拟机允许应用程序具有多个并发运行的执行线程。



每个线程都有一个优先级,优先级高的线程比优先级低的线程优先执行。每个线程可能会也可能不会被标记为守护(daemon)线程。当某些线程(比如线程A)中运行的代码创建新的Thread对象(线程B)时,新线程(线程B)的优先级被设置为等于创建线程(线程A)的优先级。并且当且仅当创建线程(线程A)是一个守护线程时,新线程(线程B)才是守护线程。



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



  • 调用了Runtime类的exist()方法,并且安全管理器(security manager)已允许进行退出操作;

  • 所有非守护线程都已死亡;

  • 调用run方法正常返回;

  • 抛出传播到run方法之外的异常。



有两种方法可以创建一个新的执行线程。一是声明一个Thread类的子类,这个子类应该重写(override)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方法,创建这个类的实例,然后这个实例作为参数传递给创建的Thread的构造方法,并启动。下面是上述例子的另一种实现方式:



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();



每个线程都有一个用于标识的名称,多个线程可以有相同的名称。如果创建线程的时候没有指定名称,则为其生成一个名称。默认名称为Thread-0,Thread-1,....



public Thread(String name) {
init(null, null, name, 0);
}
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}



比如,排查线上问题时,我们通常需要查看日志文件,这时候可以根据线程名称查看某个线程在一段时间内执行的业务逻辑。



学习技术就要读第一手资料,比如读Javadoc。以上内容大部分翻译自java.lang.Thread类源码的注释文档。



发布于: 2020 年 06 月 10 日阅读数: 111
用户头像

geekymv

关注

公众号:geekymv 2018.03.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
Java的文章可以附在活动贴下方盖楼https://xie.infoq.cn/article/d03635d2965e0af9244b736e5
2020 年 06 月 10 日 14:09
回复
没有更多了
聊聊Java中的Thread类