(一)线程的定义
在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
(二)创建线程的方式(继承Thread类 与实现Runnable接口)
1 继承Thread类
public class 类名 extends Thread{
public 类名() {
//编写子类的构造方法,可省略
}
属性 //声明子类的数据成员
方法 //定义子类自己的方法
public void run() {
//重写Thread类的run方法
}
}
用继承Thread类的子类创建线程对象:子类类名 对象名 = new 子类类名();
子类对象名.start(); ——start()的作用是使该线程开始执行,JAVA虚拟机调用该线程的run方法。
2 实现Runnable接口
用Runnable接口来创建线程就是在一个类中实现Runnable接口,并在该类中重写run方法。
创建线程的步骤如下:
(1) 生成Runnable接口的类的实例化对象
class RunnableSub implements Runnable
RunnableSub rs=new RunnableSub(); ——注意:rs并不是线程对象,只是一个普通的类对象
(2 )用带有Runnable参数类型的Thread类构造方法创建线程对象
Thread t = new Thread(rs); ——注意:创建真正的线程对象时必须用带有Runnable参数的Thread类创建的对象,例如 t就是线程对象
(3 )启动线程
t.start();
3 两种方式的区别
实现Runnable接口除了拥有和继承Thread类一样的功能外,还具有以下功能。
(1)适合多个相同程序代码的线程处理同一资源的情况,可以把线程同程序中的数据有效分离,较好的体现了面向对象的设计思想。
(2)可以避免由于JAVA的单继承特性带来的局限。例如,class Student已经继承了class Person,如果要把Student类放入多线程中去,就不能使用继承Thread类的方式。因为在JAVA中规定一个类智能有一个父类,不能同时有两个父类,所以只能使用实现Runnable接口的方式了。
(3)增强了代码的健壮性,代码能够被多个线程共同访问,代码和数据时独立的。多个线程可以操作相同的数据,与它们的代码无关。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。