一、Thread类

1、Thread类概述

Thread类是java.lang包中的一个类,继承Object父类,实现Runnable接口:

  • 继承关系
|--- java.lang.Object
	|--- java.lang.Thread
  • 实现的接口
    Runnable
  • 子类
    ForkJoinWorkerThread

Thread是一个程序中的执行线程。Java虚拟机允许应用程序同时运行多个执行线程。每个线程都有一个优先级,优先执行优先级较高的线程。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

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

  • 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
  • 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。

2、嵌套类摘要

修饰符/类型

类名

描述

static class

Thread.Stste

线程状态

static interface

Thread.UncaughtExceptionHandler

Thread 因未捕获的异常而突然终止时,调用处理程序的接口。

嵌套类定义及相关内容请查看嵌套类

3、字段摘要

修饰符/类型

字段

描述

static int

MAX_PRIORITY

线程可以具有的最高优先级。

static int

MIN_PRIORITY

线程可以具有的最低优先级。

static int

NORM_PRIORITY

分配给线程的默认优先级。

4、构造方法摘要

构造方法

描述

Thread()

分配新的 Thread 对象。

Thread(Runnable target)

分配新的 Thread 对象。

Thread(Runnable target, String name)

分配新的 Thread 对象。

Thread(String name)

分配新的 Thread 对象。

Thread(ThreadGroup group, Runnable target)

分配新的 Thread 对象。

Thread(ThreadGroup group, Runnable target, String name)

分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小

Thread(ThreadGroup group, String name)

分配新的 Thread 对象。

5、方法摘要

(1)Thread的主要方法

修饰符/类型

方法

描述

static int

activeCount()

返回当前线程的线程组中活动线程的数目。

void

checkAccess()

判定当前运行的线程是否有权修改该线程。

protected Object

clone()

当线程不能被有意义地克隆时抛出CloneNotSupportedException。

static Thread

currentThread()

返回对当前正在执行的线程对象的引用。

static

void

dumpStack()

将当前线程的堆栈跟踪打印至标准错误流。

static int

enumerate(Thread[] tarray)

将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。

static Map <Thread,StackTraceElement[]>

getAllStackTraces()

返回所有活动线程的堆栈跟踪的一个映射。

ClassLoader

getContextClassLoader()

返回该线程的上下文 ClassLoader。

static Thread. UncaughtExceptionHandler

getDefaultUncaughtExceptionHandler()

返回线程由于未捕获到异常而突然终止时调用的默认处理程序。

Long

getId()

返回该线程的标识符。

String

getName()

返回该线程的名称。

int

getPriority()

返回线程的优先级。

StackTraceElement[]

getStackTrace()

返回一个表示该线程堆栈转储的堆栈跟踪元素数组。

Thread.State

getState()

返回该线程的状态。

ThreadGroup

getThreadGroup()

返回该线程所属的线程组。

Thread. Uncaught ExceptionHandler

getUncaughtExceptionHandler()

返回该线程由于未捕获到异常而突然终止时调用的处理程序。

static boolean

holdsLock(Object obj)

(Object obj) 当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。

void

interrupt()

中断线程。

static boolean

interrupted()

测试当前线程是否已经中断。

boolean

isAlive()

测试线程是否处于活动状态。

boolean

isDaemon()

测试该线程是否为守护线程。

boolean

isInterrupted()

测试线程是否已经中断。

void

join()

等待该线程终止。

void

join(long millis)

等待该线程终止的时间最长为 millis 毫秒 。

void

join(long millis, int nanos)

等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。

void

run()

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

void

setContextClassLoader(ClassLoader cl)

设置该线程的上下文 ClassLoader。

void

setDaemon(boolean on)

将该线程标记为守护线程或用户线程。

static void

setDefaultUncaughtExceptionHandler

(Thread.UncaughtExceptionHandler eh)

设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。

void

setName(String name)

改变线程名称,使之与参数 name 相同。

void

setPriority(int newPriority)

更改线程的优先级。

void

setUncaughtExceptionHandler

(Thread.UncaughtExceptionHandler eh)

设置该线程由于未捕获到异常而突然终止时调用的处理程序。

static void

sleep(long millis)

在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

static void

sleep(long millis, int nanos)

在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

void

start()

使该线程开始执行;Java 虚拟机调用该线的 run 方法。

String

toString()

返回该线程的字符串表示形式,包括线程名称、优先级和线程组。

static void

yield()

暂停当前正在执行的线程对象,并执行其他线程。

(2)从java.lang.Object中继承的方法

equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

二、Runnable接口

如果当前类不仅要继承其他类(非Thread类),还要实现多线程,那么该如何处理呢?继承Thread类肯从不行,因为Java不支持多继承。这这种情况下只能通过实现Runnable接口来创建Thread类对象。

1、Runnable接口概述

  • 子接口:
    RunnableFuture, RunnableScheduledFuture
  • 实现类:
    AsyncBoxView.ChildState, ForkJoinWorkerThread, FutureTask, RenderableImageProducer, SwingWorker, Thread, TimerTask
  • Object类的子类实现Runnable接口的语法
public class ThreadTest extends Object implements Runnable{
  
}

🌿说明:从Java API中可以发现,Thread类已经实现了Runnable接口,Thread类的run()方法正是Runnable接口中的run()方法的具体实现。

Runnable接口是一个函数接口,因此可以用作lambda表达式或方法引用的赋值目标。

实例由线程执行的类都应该可以实现Runnable接口。该类必须定义一个名为run的不带参数的方法。

此接口旨在为那些活动中的代码(启动但还未停止运行的代码)对象提供公共协议,例如Runnable是通过Thread类实现的。

此外,Runnable提供了在不创建Thread子类的情况下使类处于活动状态的方法。实现Runnable的类可以通过实例化一个线程实例并将其自身作为目标传入而不需要对Thread进行子类化来运行。在大多数情况下,如果只打算覆写run()方法而不打算覆写其他线程方法,那么应该使用Runnable接口。这一点很重要,因为除非程序员打算修改或增强类的基本行为,否则不应该对类进行子类化。

2、Runnable接口的方法

修饰符/类型

方法

描述

void

run()

当使用实现接口Runnable的对象创建线程时,启动该线程将会在该单独执行的线程中调用对象的run()方法。

三、使用两种方法创建多线程

有两种方法可以创建一个新的执行线程。一种是将一个类声明为Thread的子类,这个子类应该重写Thread类的run()方法,然后可以分配和启动子类的实例。另一种方法是声明一个实现Runnable接口的类,实现run()方法,然后可以分配类的实例,在创建线程时作为参数传递,再启动即可。下面是两种方式创建多线程:

实例1:继承Thread类,覆写run()方法实现多线程

计算大于指定值的素数的线程

class PrimeThread extends Thread{
	long minPrime;
  PrimeThread(long minPrime){
    this.minPrime = minPrime;
  }
  public void run(){
    //compute prime larger tham minPrime
    ../
  }
  
  public static void main(String[] args){
    PrimeThread test = new primeThread(111123);
    test.start();
  }
}
实例1:实现Runnable接口,调用run()方法实现多线程

计算大于指定值的素数的线程

class PrimeRun implements Runnable{
	long minPrime;
  PrimeRun(long minPrime){
    this.minPrime = minPrime;
  }
  public void run(){
    //compute prime larger tham minPrime
    ../
  }
  
  public static void main(String[] args){
    PrimeRun test = new primeRun(111123212);
    new Thread(test).start;
  }
}

每个线程都有一个用于标识的名称,当然多个线程可能具有相同的名称。如果在创建线程时未指定名称,则会自动为其生成一个新名称。

除非另有说明,否则将null参数传递给此类中的构造函数或方法将导致抛出NullPointerException异常。