Thread类详解
java.lang
类 Thread
java.lang.Object
java.lang.Thread
- 所有已实现的接口:
- Runnable
public class Threadextends Objectimplements Runnable
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
- 调用了
Runtime类的exit方法,并且安全管理器允许退出操作发生。 - 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到
run方法之外的异常。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeThread p = new PrimeThread(143);
p.start();
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
然后,下列代码会创建并启动一个线程:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
- 从以下版本开始:
- JDK1.0
- 另请参见:
Runnable,Runtime.exit(int),run(),stop()
| 嵌套类摘要 | |
|---|---|
static class |
Thread.State 线程状态。 |
static interface |
Thread.UncaughtExceptionHandler当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。 |
| 字段摘要 | |
|---|---|
static int |
MAX_PRIORITY线程可以具有的最高优先级。 |
static int |
MIN_PRIORITY线程可以具有的最低优先级。 |
static int |
NORM_PRIORITY分配给线程的默认优先级。 |
| 构造方法摘要 | |
|---|---|
Thread()分配新的 Thread 对象。 |
|
Thread(Runnable target)分配新的 Thread 对象。 |
|
Thread(Runnable target, 分配新的 Thread 对象。 |
|
Thread(String name)分配新的 Thread 对象。 |
|
Thread(ThreadGroup group, Runnable target)分配新的 Thread 对象。 |
|
Thread(ThreadGroup group, Runnable target, 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name作为其名称,并作为 group 所引用的线程组的一员。 |
|
Thread(ThreadGroup group, Runnable target, 分配新的 Thread 对象,以便将target 作为其运行对象,将指定的 name 作为其名称,作为 group所引用的线程组的一员,并具有指定的堆栈大小。 |
|
Thread(ThreadGroup group, String name)分配新的 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, 等待该线程终止的时间最长为 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,在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
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()暂停当前正在执行的线程对象,并执行其他线程。 |
| 从类 java.lang.Object 继承的方法 |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Thread类详解的更多相关文章
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- java.lang.Thread类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- thread 类详解
java.lang.Thread类详解 一.前言 位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前 ...
- 并发编程(四)Thread类详解
一.引言 Thread类中存在着许多操作线程的方法,学习Thread类是非常有必要的,前面我们也嘘唏了创建线程的几种方式,若线程的创建不是以继承Thread类的方式创建的,那我们又改如何使用Threa ...
- C#中的多线程使用 -- Thread 类详解(转)
现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程. 建议使用线程的同步手段有: Mutex.ManualResetEvent.Auto ...
- Java知多少(58)线程Runnable接口和Thread类详解
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- Thread类详解 多线程中篇(二)
Java.lang.Thread是Java应用程序员对Java多线程的第一站,Thread就是对Java线程本身的抽象 所以在Java中的线程编程概念中,一个Thread实例 == 一个线程 线程有哪 ...
- java之AbstractStringBuilder类详解
目录 AbstractStringBuilder类 字段 构造器 方法 public abstract String toString() 扩充容量 void expandCapacity(in ...
- Java线程创建形式 Thread构造详解 多线程中篇(五)
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...
随机推荐
- DB2查询结果显示n行
在SQLserver中语法是这样的:select top n * from staff ,即可查询显示n行数据 但是在DB2中语法是这样的,感觉比较接近英语. select * from STAFF ...
- Resource is out of sync with the file system
Resource is out of sync with the file system解决办法: 在eclipse或mycelipse中,启动run on server时或查看项目文件时报错:Res ...
- oracle 11g 分区表
查看所有用户分区表及分区策略(1.2级分区表均包括): SELECT p.table_name AS 表名, decode(p.partitioning_key_count, 1, '主分区') AS ...
- [原创]在Windows和Linux中搭建PostgreSQL源码调试环境
张文升http://ode.cnblogs.comEmail:wensheng.zhang#foxmail.com 配图太多,完整pdf下载请点这里 本文使用Xming.Putty和VMWare几款工 ...
- SQL*PLUS下使用AUTOTRACE、sql顾问、实时sql监控
高级SQL优化(三) 常用优化工具 ——<12年资深DBA教你Oracle开发与优化—— 高级SQL优化(一) ——<12年资深DBA教你Oracle开发与优化——性能优化部分 1 aut ...
- hdu 1212 Big Number
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1212 Big Number Description As we know, Big Number is ...
- shell 与用户交互
bash shell如何获取命令行参数(添加到命令后的数据).命令行选项(确定命令行为的英文字母).键盘输入数据? 操作命令行参数 1 读取参数 bash shell用位置参数变量(positiona ...
- 【转载】about slack
About Slack slack is the difference b/w the REQUIRED TIME and the ARRIVAL TIME. 1.WHAT IS SLACK WITH ...
- python关于字典的使用方法
#-*- coding:utf-8 -*-#Author:gxli#定义字典id_db={ 233333199211222342:{ 'name':'xiaoa', 'age':23, 'addr': ...
- Java程序员面试中的多线程问题
很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的.这篇文章收集了Java线程方面 ...