Thread 类重要方法讲解

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是一个线程组,百度百科里对线程组的解释如下:

所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。每个应用都至少有一个线程从属于系统线程组。若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。
线程组也必须从属于其他线程组。必须在构建器里指定新线程组从属于哪个线程组。若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下。因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的“父”
之所以要提出“线程组”的概念,一般认为,是由于“安全”或者“保密”方面的理由。根据Arnold和Gosling的说法:“线程组中的线程可以修改组内的其他线程,包括那些位于分层结构最深处的。一个线程不能修改位于自己所在组或者下属组之外的任何线程””

线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息。

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方法,便可以根据自己的需要调用不同的构造方法,传入不同的参数,构造符合自己需要的线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值