Java Thread类简介说明
下文讲述Thread类的简介说明,如下所示:
例:
定义一个线程
线程Thread:通俗的讲就是一个程序的多个并行的运行分支(路径), 线程Thread:是CPU执行调度的单位,一个进程内的所有线程可以共享进程的资源(内存,设备等) 同时每个线程拥有自己的内存空间,我们将这个独享的空间称之为“线程栈” 线程栈是由线程创建时系统分配,用于保存线程内部所使用的数据信息, 如:一些变量信息 -------------------------------------------------- java中多线程机制,可以更好的压榨CPU,使用CPU的计算能力得到最高效的使用
Thread类的构造函数
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 对象
Thread类的属性
MIN_PRIORITY:一个线程可以拥有的最低优先级1 NORM_PRIORITY:分配给线程的默认优先级5 MAX_PRIORITY:一个线程能够拥有的最高优先级10
Thread类的方法
static int activeCount() 返回当前线程的线程组中活动线程的数目。 |
void checkAccess() 判定当前运行的线程是否有权修改该线程。 |
int countStackFrames() 已过时。 该调用的定义依赖于 suspend(),但它遭到了反对。此外,该调用的结果从来都不是意义明确的。 |
static Thread currentThread() 返回对当前正在执行的线程对象的引用。 |
void destroy() 已过时。 该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不过,该方法决不会被实现。即使要实现,它也极有可能以 suspend() 方式被死锁。如果目标线程被破坏时保持一个保护关键系统资源的锁,则任何线程在任何时候都无法再次访问该资源。如果另一个线程曾试图锁定该资源,则会出现死锁。这类死锁通常会证明它们自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。 |
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.UncaughtExceptionHandler getUncaughtExceptionHandler() 返回该线程由于未捕获到异常而突然终止时调用的处理程序。 |
static boolean holdsLock(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 resume() 已过时。 该方法只与 suspend() 一起使用,但 suspend() 已经遭到反对,因为它具有死锁倾向。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume。 |
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 方法。 |
void stop() 已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume。 |
void stop(Throwable obj) 已过时。 该方法具有固有的不安全性。有关详细信息,请参阅 stop()。 该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。 有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。 |
void suspend() 已过时。 该方法已经遭到反对,因为它具有固有的死锁倾向。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前任何线程都不能访问该资源。如果重新开始目标线程的线程想在调用 resume 之前锁定该监视器,则会发生死锁。这类死锁通常会证明自己是“冻结”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume。 |
String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 |
static void yield() 暂停当前正在执行的线程对象,并执行其他线程 |
定义一个线程
public class ThreadTest extends Thread { /** * 重写(Override)run()方法 JVM会自动调用该方法 */ public void run() { System.out.println("我是线程--"); } }
线程运行
通过实例化线程,然后调用Thread中的start方法即可ThreadTest1 t = new ThreadTest1(); t.start();
线程状态
- 新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(not alive)。
- 就绪状态(Runnable): 通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态; 此时线程是活着的(alive)。
- 运行状态(Running): 一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。
- 阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)
- 死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thready已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的call stack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(Runtime exception)的异常;处于Dead状态的线程不是活着的(not alive)
public class ThreadTest extends Thread { public void run() { try { for (int i = 0; i <3; i++) { Thread.sleep((int)(Math.random() * 1000)); System.out.println("run = " + Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ThreadTest t = new ThreadTest(); t.start(); try { for (int i = 0; i < 3; i++) { Thread.sleep((int)(Math.random() * 1000)); System.out.println("run = " + Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。