Java 中的线程

Java 使用 Thread 类实现执行线程。你可以使用以下机制在应用程序中创建执行线程。

这两种情况下你都会得到一个 Thread 对象,但是相对于第一种方式来说,更推荐使用第二种。其主要优势如下:

一旦有了 Thread 对象,就必须使用 start() 方法创建新的执行线程并且执行 Thread 类的 run()方法。
如果直接调用 run() 方法,那么你将调用常规 Java 方法而不会创建新的执行线程。

Java 中的线程:特征和状态

线程优先级

Java 中的所有线程都有一个优先级,这个整数值介于 Thread.MIN_PRIORITYThread.MAX_PRIORITY 之间(实际上它们的值分别是 1 和 10)。
所有线程在创建时其默认优先级都是 Thread.NORM_PRIORITY (实际上它的值是 5)。
可以使用 setPriority() 方法更改 Thread 对象的优先级(如果该操作不允许执行,它会抛出 SecurityException 异常)和 getPriority() 方法获得 Thread 对象的优先级。

对于 Java 虚拟机和线程首选底层操作系统来说,这种优先级是一种提示,而非一种契约。
线程的执行顺序并没有保证。通常,较高优先级的线程将在较低优先级的线程之前执行,但是,正如之前所述,这一点并不能保证。

守护线程和非守护线程

在 Java 中,可以创建两种线程。

二者之间的区别在于它们如何影响程序的结束。

当有下列情形之一时,Java程序将结束其执行过程。

具有这些特征的守护线程通常用在作为垃圾收集器或缓存管理器的应用程序中,执行辅助任务。

你可以使用 isDaemon() 方法检查线程是否为守护线程,也可以使用 setDaemon() 方法将某个线程确立为守护线程。
要注意,必须在线程使用 start() 方法开始执行之前调用此方法。

线程状态

不同情况下线程的状态不同。所有可能的状态都在 Thread.States 类中定义。

可以使用 getState() 方法获取 Thread 对象的状态。显然,你还可以直接更改线程的状态。

线程的可能状态如下。

在给定时间内,线程只能处于一个状态。
这些状态不能映射到操作系统的线程状态,它们是 JVM 使用的状态。

Thread 类和 Runnable 接口

Thread 类的其他常用方法

获取和设置 Thread 对象信息的方法: