一、基本使用
1、继承Thread类
2、实现Runnable接口
3、Handler
1、继承Thread类
①定义:Theard类是java实现多线程的具体类
②作用:实现多线程
③特点:
-
优点 :实现简单,只继承了
Thread
类和复写run()
就可以实现多线程的操作 -
缺点:
1、局限性大。因为必须要继承Thread类,而java是单继承,即继承了Thread就不能继承别的类了
2、不适合资源的共享。1个线程就是一个实例对象,相对独立,无法进行资源共享
3、消耗资源。
Thread线程 = 一次性消费品; 一个线程=一个耗时任务,当执行完一个耗时任务后,线程就会被自动销毁,所以有100个耗时任务就必须有100个线程; 多次创建和销毁线程比较消耗系统资源
④使用:1、先创建线程类(继承自Thread)——> 重写run方法(即里面写该线程具体要做什么事情)——> 创建线程对象(即实例化线程类)——>通过线程的对象控制线程的状态(开启和停止)
方法一:基本用法
// 步骤1:创建线程类 (继承自Thread类)
class MyThread extends Thread{
// 步骤2:复写run(),内容 = 定义线程行为
@Override
public void run(){
... // 定义的线程行为
}
}
// 步骤3:创建线程对象,即 实例化线程类
MyThread mt=new MyThread(“线程名称”);
// 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止
// 此处采用 start()开启线程
mt.start();
方法二:使用匿名类
// 步骤1:采用匿名类,直接 创建 线程类的实例
new Thread("线程名称") {
// 步骤2:复写run(),内容 = 定义线程行为
@Override
public void run() {
// 步骤3:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止
}.start();
上述两种方式各有优缺点:
⑤实际应用
2、实现Runnable接口
接下来开始是对Runnable接口的简单理解:
①定义:它是与多线程相关的抽象接口,其中仅定义了一个run()
方法。
②作用:实现多线程。
③特点:优点:
1、适合资源的共享。Runnable的代码可以被多个线程(Thread实例)共享,适用于多个线程处理同一个资源。
2、较为灵活。一个类可以实现多个接口,避免了继承Thread类方式所导致的单继承的局限性。
④使用:创建线程辅助类(实现Runnable接口)——> 重写run()(定义线程的具体作用)——> 创建线程辅助对象(即实例化线程辅助类)——>创建线程对象 (即实例化线程类,线程类 = Thread类,创建时传入线程辅助对象)——> 通过线程对象控制线程的状态
特别注意:
- Java中真正能创建新线程的只有Thread类对象
- 通过实现Runnable的方式,最终还是通过Thread类对象来创建线程
- 所以对于实现了Runnable接口的类,称为 线程辅助类;Thread类才是真正的线程类
方法一:基本用法
// 步骤1:创建线程辅助类,实现Runnable接口
class MyThread implements Runnable{
....
@Override
// 步骤2:复写run(),定义线程行为
public void run(){
}
}
// 步骤3:创建线程辅助对象,即 实例化 线程辅助类
MyThread mt=new MyThread();
// 步骤4:创建线程对象,即 实例化线程类;线程类 = Thread类;
// 创建时通过Thread类的构造函数传入线程辅助类对象
// 原因:Runnable接口并没有任何对线程的支持,我们必须创建线程类(Thread类)的实例,从Thread类的一个实例内部运行
Thread td=new Thread(mt);
// 步骤5:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止
// 当调用start()方法时,线程对象会自动回调线程辅助类对象的run(),从而实现线程操作
td.start();
方法二:使用匿名类
// 步骤1:采用匿名类,直接 创建 线程类的实例
// 步骤1:通过匿名类 直接 创建线程辅助对象,即 实例化 线程辅助类
Runnable mt = new Runnable() {
// 步骤2:复写run(),定义线程行为
@Override
public void run() {
}
};
// 步骤3:创建线程对象,即 实例化线程类;线程类 = Thread类;
Thread mt1 = new Thread(mt, "窗口1");
// 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止
mt1.start();
上述两种方式各有优缺点:
⑤实际应用:
3、Handler
二、复合使用
AsyncTask
HandlerThread
IntentService