1.run()方法
Thread类的run()方法什么都不做,是一个空的实现,所以我们在继承了Thread类之后一定要重写run()方法。
Thread类中run()的实现如下:
public void run() {
if (target != null) {
target.run();
}
}
而此处的target则是一个Runnable接口类型的变量
2.start()方法
Thread的start()方法才是真正执行线程应该调用的额方法
当这个方法我们显示的调用,然后由虚拟机调用
start()的方法构成如下
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
注意:
此处调用了start0()方法,而start0方法的实现如下
private native void start0();这样我们可以证明,线程的真正调用是需要通过系统来维持的,我们在写好自己的线程后,调用了start方法后,并不是立刻就调用了我们的线程,而是由系统决定什么时候开始真正调用。
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
分析start方法我们可以发现,grop是将当前线程键入到某个类似集合的变量中去
进一步分析可以得到
Thread类中定义了 private ThreadGroup group;
ThreadGroup是一个线程组,百度百科里对线程组的解释如下:
线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息。
3.init()方法
这个方法是private类型的,其源码定义如下
private void init(ThreadGroup g, Runnable target, String name,
long stackSize)
ThreadGroup是线程组类
Runnable是实现多线程所要实现的一个接口
name是线程的名字
stackSize线程栈的大小
4.构造方法
(1)说明:通过该构造方法构造的线程的默认的名字是“Thread-”+1+...N,线程栈是0
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
(2)实现线程有两种方法,当我们以实现Runnable接口,实现其run()方法的方式类构造一个线程的时候,使用线程就要这样写
Thread myThread = new Thread(new Runnable()//匿名内部类的方式
{
public void run() {
}
}
);
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
这样我们传入进来的参数target就是一个Runnable类型的了,所以我们要让自己的线程做点什么的话,就一定必须实现Runnable的run()方法
(3)
public Thread(ThreadGroup group, Runnable target) {
init(group, target, "Thread-" + nextThreadNum(), 0);
}
(4)
public Thread(String name) {
init(null, null, name, 0);
}
(5)public Thread(ThreadGroup group, String name) {
init(group, null, name, 0);
}
(6)public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
(7)public Thread(ThreadGroup group, Runnable target, String name) {
init(group, target, name, 0);
}
(8)public Thread(ThreadGroup group, Runnable target, String name,
long stackSize) {
init(group, target, name, stackSize);
}
构造方法都调用了init方法,便可以根据自己的需要调用不同的构造方法,传入不同的参数,构造符合自己需要的线程