一、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 | 当 |
嵌套类定义及相关内容请查看嵌套类
3、字段摘要
修饰符/类型 | 字段 | 描述 |
static int | MAX_PRIORITY | 线程可以具有的最高优先级。 |
static int | MIN_PRIORITY | 线程可以具有的最低优先级。 |
static int | NORM_PRIORITY | 分配给线程的默认优先级。 |
4、构造方法摘要
构造方法 | 描述 |
Thread() | 分配新的 |
Thread(Runnable target) | 分配新的 |
Thread(Runnable target, String name) | 分配新的 |
Thread(String name) | 分配新的 |
Thread(ThreadGroup group, Runnable target) | 分配新的 |
Thread(ThreadGroup group, Runnable target, String name) | 分配新的 |
Thread(ThreadGroup group, Runnable target, String name, long stackSize) | 分配新的 |
Thread(ThreadGroup group, String name) | 分配新的 |
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异常。