11_01.【Java】多线程(Thread类和Runnable接口详述)

一、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 classThread.Stste线程状态
static interfaceThread.UncaughtExceptionHandlerThread 因未捕获的异常而突然终止时,调用处理程序的接口。

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

3、字段摘要

修饰符/类型字段描述
static intMAX_PRIORITY线程可以具有的最高优先级。
static intMIN_PRIORITY线程可以具有的最低优先级。
static intNORM_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 intactiveCount()返回当前线程的线程组中活动线程的数目。
voidcheckAccess()判定当前运行的线程是否有权修改该线程。
protected Objectclone()当线程不能被有意义地克隆时抛出CloneNotSupportedException。
static ThreadcurrentThread()返回对当前正在执行的线程对象的引用。
static
void
dumpStack()将当前线程的堆栈跟踪打印至标准错误流。
static intenumerate(Thread[] tarray)将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中。
static Map <Thread,StackTraceElement[]>getAllStackTraces()返回所有活动线程的堆栈跟踪的一个映射。
ClassLoadergetContextClassLoader()返回该线程的上下文 ClassLoader。
static Thread. UncaughtExceptionHandlergetDefaultUncaughtExceptionHandler()返回线程由于未捕获到异常而突然终止时调用的默认处理程序。
LonggetId()返回该线程的标识符。
StringgetName()返回该线程的名称。
intgetPriority()返回线程的优先级。
StackTraceElement[]getStackTrace()返回一个表示该线程堆栈转储的堆栈跟踪元素数组。
Thread.StategetState()返回该线程的状态。
ThreadGroupgetThreadGroup()返回该线程所属的线程组。
Thread. Uncaught ExceptionHandlergetUncaughtExceptionHandler()返回该线程由于未捕获到异常而突然终止时调用的处理程序。
static booleanholdsLock(Object obj)(Object obj) 当且仅当当前线程在指定的对象上保持监视器锁时,才返回 true。
voidinterrupt()中断线程。
static booleaninterrupted()测试当前线程是否已经中断。
booleanisAlive()测试线程是否处于活动状态。
booleanisDaemon()测试该线程是否为守护线程。
booleanisInterrupted()测试线程是否已经中断。
voidjoin()等待该线程终止。
voidjoin(long millis)等待该线程终止的时间最长为 millis 毫秒 。
voidjoin(long millis, int nanos)等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
voidrun()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
voidsetContextClassLoader(ClassLoader cl)设置该线程的上下文 ClassLoader。
voidsetDaemon(boolean on)将该线程标记为守护线程或用户线程。
static voidsetDefaultUncaughtExceptionHandler
(Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获到异常而突然终止,并且没有为该线程定义其他处理程序时所调用的默认处理程序。
voidsetName(String name)改变线程名称,使之与参数 name 相同。
voidsetPriority(int newPriority)更改线程的优先级。
voidsetUncaughtExceptionHandler
(Thread.UncaughtExceptionHandler eh)
设置该线程由于未捕获到异常而突然终止时调用的处理程序。
static voidsleep(long millis)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
static voidsleep(long millis, int nanos)在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
voidstart()使该线程开始执行;Java 虚拟机调用该线的 run 方法。
StringtoString()返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
static voidyield()暂停当前正在执行的线程对象,并执行其他线程。

(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接口的方法

修饰符/类型方法描述
voidrun()当使用实现接口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异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值