程序中执行的线程。JVM允许应用程序拥有多个并发运行的执行线程。
每个线程都有一个优先级。优先级高的线程优先于优先级低的线程执行。每个线程可能被标记为守护线程,也可能不被标记为守护线程。
当在某个线程中运行的代码创建一个新 Thread 对象时,新线程的优先级最初设置为创建线程的优先级,并且只有在创建线程是一个守护线程时,新线程才是守护线程。
当JVM启动时,通常有一个非守护的线程(它通常调用某个指定类的main方法)。JVM 继续执行线程,直到发生以下任何一种情况时停止:
Runtime 类的 exit 方法已被调用,且安全管理器已允许执行退出操作(比如调用 Thread.interrupt 方法)
不是守护线程的所有线程都已死亡,要么从对 run 方法的调用返回,要么抛出一个在 run 方法之外传播的异常
每个线程都有名字,多个线程可能具有相同的名字,Thread 有的构造器如果没有指定名字,会自动生成一个名字。
源码中一共枚举了六种线程状态
NEW
表示线程创建成功,但还没有运行,在 new Thread
后,没有 start
前,线程的状态都是 NEW
;
当调用start()
,进入RUNNABLE
,当前线程sleep()结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入RUNNABLE
当线程运行完成、被打断、被中止,状态都会从 RUNNABLE
变成 TERMINATED
如果线程正好在等待获得 monitor lock 锁,比如在等待进入 synchronized 修饰的代码块或方法时,会从 RUNNABLE
转至 BLOCKED
WAITING
和 TIMED_WAITING
类似,都表示在遇到 Object#wait、Thread#join、LockSupport#park 这些方法时,线程就会等待另一个线程执行完特定的动作之后,才能结束等待,只不过 TIMED_WAITING
是带有等待时间的
优先级代表线程执行的机会的大小,优先级高的可能先执行,低的可能后执行,在 Java 源码中,优先级从低到高分别是 1 到 10,线程默认 new 出来的优先级都是 5,源码如下:
创建的线程默认都是非守护线程。
创建守护线程时,需要将 Thread 的 daemon 属性设置成 true
无返回值的线程主要有两种初始化方式:
看下 start 方法的源码:
注意上面提到的的threadStatus
变量
用于工具的Java线程状态,初始化以指示线程“尚未启动”
使用 start 会开启子线程来执行 run 里面的内容
使用 run 方法执行的还是主线程。
我们来看下 run 方法的源码:
不会新起线程,target 是 Runnable
线程初始化的源码有点长,我们只看比较重要的代码 (不重要的被我删掉了),如下:
从初始化源码中可以看到,很多属性,子线程都是直接继承父线程的,包括优先性、守护线程、inheritableThreadLocals 里面的值等等。
join 的意思就是当前线程等待另一个线程执行完成之后,才能继续操作,我们写了一个 demo,如下:
执行的结果,就是主线程在执行 thread.join (); 代码后会停住,会等待子线程沉睡 30 秒后再执行,这里的 join 的作用就是让主线程等待子线程执行完成,我们画一个图示意一下:
从图中可以看出,主线程一直等待子线程沉睡 30s 后才继续执行,在等待期间,主线程的状态也是 TIMED_WAITING。
yield 是个 native 方法,源码如下:
在写 while 死循环时,预计短时间内 while 死循环可结束的话,可在其中使用 yield 方法,防止 cpu 一直被占用。
让步不是绝不执行,重新竞争时,cpu 也有可能还重新选中自己。
sleep 也是 native 方法,可以接受毫秒的一个入参
也可以接受毫秒和纳秒的两个入参
接受毫秒和纳秒两个入参时,如果给定纳秒大于等于 0.5 毫秒,算一个毫秒,否则不算。
表示中断当前运行的线程,比如:
Object#wait ()、Thread#join ()、Thread#sleep (long) 这些方法运行后,线程的状态是 WAITING
或 TIMED_WAITING
,这时候打断这些线程,就会抛出 InterruptedException 异常,使线程的状态直接到 TERMINATED
;
如果 I/O 操作被阻塞了,我们主动打断当前线程,连接会被关闭,并抛ClosedByInterruptException
来说明如何打断 WAITING
的线程,代码如下:
例子主要说的是,主线程会等待子线程执行 1s,如果 1s 内子线程还没有执行完,就会打断子线程,子线程被打断后,会抛出 InterruptedException 异常,执行结束。
========
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
关注公众号 『 Java斗帝 』,不定期分享原创知识。
同时可以期待后续文章ing??
原文:https://www.cnblogs.com/javadoudi/p/13936545.html