Android多线程解析

前言

  • Android开发中,多线程的使用十分常见
  • 今天,我将全面解析多线程中最常见的2种用法:继承Thread类 & 实现Runnable接口

含丰富的实例讲解,切记不能错过。


Part 1:继承Thread类

目录

示意图


1. 简介

示意图


2. 使用讲解

2.1 使用步骤

示意图

2.2 具体使用


// 步骤1:创建线程类 (继承自Thread类)
class MyThread extends Thread{

// 步骤2:复写run(),内容 = 定义线程行为
    @Override
    public void run(){
    ... // 定义的线程行为
    }
}

// 步骤3:创建线程对象,即 实例化线程类
  MyThread mt=new MyThread(“线程名称”);

// 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起  / 停止
// 此处采用 start()开启线程
  mt.start();

2.3 简便使用:匿名类

很多情况下,开发者会选择一种更加方便的方法去创建线程:匿名类


// 步骤1:采用匿名类,直接 创建 线程类的实例
new Thread(“线程名称”) {
// 步骤2:复写run(),内容 = 定义线程行为
@Override
public void run() {
// 步骤3:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起 / 停止
}.start();

2.3 区别

2种方法本质相同,但是各有优劣势 & 不同的应用场景:

大家可根据自己的需求场景来选择具体的使用方法

示意图

为了让大家理解更加深刻,下面例子我都会采用 方法1 = 常规方式 来演示


3. 实例应用

实例1

  • 应用场景:创建两个线程-实现两个相同的耗时任务
  • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,卖票速度都是1s/张

建议先下载Demo再看分析:Carson_Ho的Github地址:多线程之继承Thread类

  • 具体实现

main_activity.xml


实例2

  • 应用场景:创建两个线程-实现两个不同的耗时任务
  • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,但卖票速度不同:窗口1是1s/张,窗口2是3s/张

建议先下载Demo再看分析:Carson_Ho的Github地址:多线程之继承Thread类

  • 具体实现

main_activity.xml


Part 2:实现Runnable接口

目录

示意图


1. 简介

示意图


2. 使用讲解

2.1 使用步骤

示意图

特别注意:
- Java中真正能创建新线程的只有Thread类对象
- 通过实现Runnable的方式, 最终还是通过Thread类对象来创建线程

所以对于 实现了Runnable接口的类,称为 线程辅助类Thread类才是真正的线程类

2.2 具体使用


// 步骤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();

2.3 简便使用:匿名类

很多情况下,开发者会选择一种更加方便的方法去创建线程: 匿名类


// 步骤1:通过匿名类 直接 创建线程辅助对象,即 实例化 线程辅助类
Runnable mt = new Runnable() {
// 步骤2:复写run(),定义线程行为
@Override
public void run() {
}
};

                // 步骤3:创建线程对象,即 实例化线程类;线程类 = Thread类;
                Thread mt1 = new Thread(mt, "窗口1");

                // 步骤4:通过 线程对象 控制线程的状态,如 运行、睡眠、挂起  / 停止
                mt1.start();

2.3 区别

2种方法本质相同,但是各有优劣势 & 不同的应用场景:

大家可根据自己的需求场景来选择具体的使用方法

示意图

为了让大家理解更加深刻,下面例子我都会采用 方法1 = 常规方式 来演示


3. 实例应用

实例1

  • 应用场景:创建两个线程-实现两个相同的耗时任务
  • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,卖票速度都是1s/张

建议先下载Demo再看分析:Carson_Ho的Github地址:多线程之继承Thread类

  • 具体实现

main_activity.xml


实例2

  • 应用场景:创建两个线程-实现两个不同的耗时任务
  • 实例说明:实现2个窗口同时卖火车票;每个窗口卖100张,但卖票速度不同:窗口1是1s/张,窗口2是3s/张

建议先下载Demo再看分析:Carson_Ho的Github地址:多线程之继承Thread类

  • 具体实现
    main_activity.xml

实例3

  • 应用场景:创建两个线程-实现一个耗时任务
  • 实例说明:实现2个窗口同时卖火车票;两个窗口一共卖100张,卖票速度均为1s/张

建议先下载Demo再看分析:Carson_Ho的Github地址:多线程之继承Thread类

  • 具体实现
    main_activity.xml

Part 3:对比

  • 继承 Thread类和实现Runnable接口是实现多线程最常用的2种方法
  • 二者对比如下:

示意图


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值