多线程--3
创建线程两种方法的对比
多线程卖票案例设计
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
1. 创建线程的两种方法的对比
1). Runnable接口
(1). Runnable接口的基础知识
[1]. Runnable接口所在的位置
Runnable接口位于java.lang包中
[2]. Runnable接口的源码声明
public interface Runnable{
publicabstract void run();
}
[3]. Runnable接口的含义
Runnable接口应该被需要由线程来执行的实例对象所属的类来实现。
(2). Runnable接口中唯一的抽象方法
[1]. 抽象方法声明
public abstractvoid run();
[2]. run方法的作用
{1}. 当实现了Runnable接口的类的实例被用来创建线程的时候(即Runnable实例被传入Thread的构造方法中的时候),开启线程(即调用线程的start()方法)会引发对象的run方法被正在被CPU运行的线程调用。
{2}. 实际上是把自定义线程要运行的线程代码存放到Runnable接口实现类的run()中。
(3). Thread类和Runnable接口的关系
[1]. Thread类所实现的接口就是Runnable接口
[2]. 源码:public class Thread implements Runnable { //...}
因此Thread类中run方法就是实现的Runnable接口中的run方法。
【MyEclipse验证】
左上角的白色的三角号就代表着这个方法是一个实现了某个接口中声明的方法。
[3]. Thread类中的Runnable类型的成员属性
public class Thread implements Runnable {
//...
/* What will berun. */
private Runnable target;
//...
}
public class Thread implements Runnable {
//...
/* What will berun. */
private Runnable target;
//...
}
这个Runnable类成员属性就用于在Thread类构造方法中接收用户传进来的自定义的Runnable实现子类的对象。
2). Thread类的构造方法 (常用)
(1). Thread类构造方法中共同调用的初始化方法init (简单了解)
[1]. Thread类的初始化init方法的声明
private void init(ThreadGroup g, Runnabletarget, String name, long stackSize);
[2]. 参数含义
{1}.ThreadGroup:线程组类 表示一组线程 (这个类不细说)
{2}.Runnable target:实际接收到实现run方法的(包含了自定义线程需要运行的代码)实现类的对象。
target的含义:就是Thread这个线程要运行的目标代码全部在Runnable的实现子类的run方法中了。所以Thread类中Runnable引用名取名为target。
{3}. String name:表示为线程取得名字
{4}. long stackSize:为要新建的线程分配的栈内存的大小。
【注意】init方法是Thread类所有构造方法调用的基础
(1). 空参构造方法
[1]. 方法原型:publicThread();
[2]. 功能:调用本地OS资源创建一个线程对象
[3]. 源码:(实际上调用Thread的init方法)
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
【
解释】
{1}. Runnable位置传入了null。这样Thread类中的Runnable类型的成员变量target的指向了null。同时在Thread类中重写的run方法如下:
Thread类中的run方法的源码:
public void run() {
if (target != null) {
target.run();// target 是Runnable接口的引用变量
}
}
【
注意】
Thread中的