Thread类
java.lang包下,是程序中的可执行线程的类。 引入Question:01.何谓线程?
- 优先级:
- 每个线程都有一个priority(优先级,1~10之间),默认是5,高优先级的线程将优于低优先级的线程执行。
- 默认情况下,新new的线程,其优先级等同于创建它的线程。
- 守护线程:
- 线程分守护线程和非守护线程两类。(引入Question:02.守护与非守护是从什么角度进行划分的?)
- 当且仅当创建新线程t1的线程f1是守护线程时,t1才默认为守护线程。
- 主线程(main线程):
- 虚拟机在启动时,通常会生成一个调用指定类的main方法的非守护线程。
- 虚拟机终止:
- 当Runtime类exit()方法被调用,且安全管理器允许执行退出操作时,虚拟机将终止线程的运行。(引入Question:03.之后虚拟机干了啥?)
- 所有非守护线程都已经死亡,要么是run方法调用的返回,或者是抛出一个异常到run方法之外。(没懂…)
- 线程名:
- 线程名是用来对线程进行区分的。
- 多个线程可能同名。(引入Question:04.为啥?)
- 当线程创建时,没有指定名字,那么将会产生一个默认名:thread-数字。
- 线程无法进行clone,执行clone()会抛出异常,建议构造一个新的线程来带代替clone(),为什么?
Thread类实现了Runnable接口,实现run方法,有时间了,看看registerNatives()干了啥。
public class Thread implements Runnable{
private static native void registerNatives();
static {
registerNatives();
}
}
方法
1. init
new Thread(),创建一个Thread类对象,所有的构造函数实际上都是在调用init()方法。
private void init(ThreadGroup g, Runnable target, String name, long stackSize){
init(g, target, name, stackSize, null, true);
}
private void init(ThreadGroup g, Runnable target, String name, long stackSize,
AccessControllerContext acc, boolean inheritThreadLocals){
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
if (security != null) {
g = security.getThreadGroup();
}
if (g == null) {
g = parent.getThreadGroup();
}
}
g.checkAccess();
if (security != null) {
if (isCCLOverridden(getClass())) {
security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
}
g.addUnstarted();
this.group = g;
this.daemon = parent.isDaemon();
this.priority = parent.getPriority();
if (security == null || isCCLOverridden(parent.getClass()))
this.contextClassLoader = parent.getContextClassLoader();
else
this.contextClassLoader = parent.contextClassLoader;
this.inheritedAccessControlContext = acc != null ? acc : AccessController.getContext();
this.target = target;
setPriority(priority);
if (inheritThreadLocals && parent.inheritableThreadLocals != null)
this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
this.stackSize = stackSize;
tid = nextThreadID();
}
为什么一定要有线程组? 安全管理器是什么?
2.构造方法
public Thread(){
init(null,null,"Thread-" + nextThreadNum(), 0);
}
public Thread(String name) {
init(null, null, name, 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
public Thread(ThreadGroup group, String name) {
init(group, null, name, 0);
}
public Thread(ThreadGroup group, Runnable target, String name) {
init(group, target, name, 0);
}
Thread(Runnable target, AccessControlContext acc) {
init(null, target, "Thread-" + nextThreadNum(), 0, acc, false);
}
public Thread(ThreadGroup group, Runnable target) {
init(group, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(ThreadGroup group, Runnable target, String name, long stackSize) {
init(group, target, name, stackSize);
}
3. start方法
start():start方法将使得线程由新创建->就绪状态,表示该线程具备被cpu执行的条件,并非正在执行,具体何时执行,取决于操作系统的任务调度算法。
- start执行时,先判断线程的状态,以此拒绝重复执行一个线程的start()方法
if (threadStatus != 0)
group.add(this);
start0();
group.threadStartFailed(this);
3.1 start0()
pass
4. exit()
exit():由系统调用,在线程真正退出之前,进行清理操作,加速资源释放。
5. stop()
stop():stop方法可以让线程终止执行,过时的方法。
|