//创建线程类
class Mythread extends Thread{
@Override
public void run(){
//定义行为
}
}
//实例化线程类
MyThread mt=new MyThread(“线程名称”);
//// 此处采用 start()开启线程
mt.start();
//更加简便的匿名类,调用简单,但是不能复用
new Thread("线程名"){
@Override
public void run() {
}.start();

Thread与Runnable区别:多线程完成独自的任务与多线程共同完成任务

//注意:其实runnable创建的还是thread类

//实现了Runnable接口的类,称为 线程辅助类;Thread类才是真正的线程类

//创建线程辅助类
class Mythread implements Runnable{
@override
public void run(){ }
}
//实例化线程辅助类
MyThread mt=new MyThread();
//实例化线程类
//runnable接口没有对线程的支持,需要新建一个线程类,从内部运行runnable类
Thread td=new Thread(mt);

  // 当调用start()方法时,线程对象会自动回调线程辅助类对象的run(),从而实现线程操作
td.start();
//匿名类runnable
Runnable mt = new Runnable(){
@Override
public void run() {
}
}; Thread mt1 = new Thread(mt, "窗口1");
mt1.start();

Handler作用于:将子线程的信息传输到主线程上,实现异步消息处理问题

在主线程实现更新组件保证了安全性,因此在app中通过Handler提醒主线程更新组件

方法1:使用 Handler.sendMessage()

//新建Handler类(内部类)
class Myhandler extends Handler{
@Override
public void handleMessage(Message msg) {
// 需执行的UI操作
}
} //在主线中新建handler实例
private Handler mhandler = new mHandler(); //创建所需的消息对象
Message msg = Message.obtain(); // 实例化消息对象
msg.what = 1; // 消息标识
msg.obj = "AA"; // 消息内容存放 //通过Handler发送消息到消息队列
mHandler.sendMessage(msg);
//匿名内部类

//在主线程中创建handler实例
private Handler mhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
...// 需执行的UI操作
}
}; //创建消息对象
Message msg = Message.obtain(); // 实例化消息对象
msg.what = 1; // 消息标识
msg.obj = "AA"; // 消息内容存放
//发送消息至消息队列中
mHandler.sendMessage(msg);

Handler.post()

// 步骤1:在主线程中创建Handler实例
private Handler mhandler = new mHandler(); // 步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容
// 需传入1个Runnable对象
mHandler.post(new Runnable() {
@Override
public void run() {
... // 需执行的UI操作
} }); // 步骤3:开启工作线程(同时启动了Handler)

Handler机制 中有3个重要的类:

  • 处理器 类(Handler)
  • 消息队列 类(MessageQueue)
  • 循环器 类(Looper)

当创建Handler时会自动创建looper和messagequeue,保证了handler的对象与looper和messagequeue的关联

Looper的主要方法

1.Looper.prepareMainLooper();//为主线程创建一个循环器对象

2.Looper.prepare();//为子线程创建一个循环器对象————这两个方法同时都可以创建一个消息队列对象

主线程不需要创建looper对象,会自动生成;但是子线程若不创建looper对象,无法生成handler对象

当生成looper&messagequeue对象时会自动进入消息循环:Looper.loop();

android实现多线程基础的更多相关文章

  1. 13、Android的多线程与异步任务

    课程目标:学习Android中异步操作的三大方式 重点难点:Handler与线程的关系   Handler消息队列的实现 考核目标: 使用Handler是异步的,它会建立新线程么? no Handle ...

  2. 2017 Android 面试题 [ 基础与细节 ]

    2017 Android 面试题 [ 基础与细节 ] 感谢@chuyao抛出的这些问题,平时业务代码写多了,很多基础的东西变得含糊不清了,这次裸辞出来找工作确实没有之前顺利,顺便求上海Android开 ...

  3. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

  4. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  5. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  6. JAVASE02-Unit09: 多线程基础

    Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 *  * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ...

  7. java多线程基础

    多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...

  8. C#编程总结(二)多线程基础

    C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...

  9. Android 触摸手势基础 官方文档概览

    Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

  10. Android Content Provider基础

    Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...

随机推荐

  1. 面试题:两个UILabel横向排列,要求压缩其中一个Label,另外一个Label的内容保持完整

    一.题目 AutoLayout中,布局两个UILabel,竖直方向处于统一水平线上:水平方向,二者间隔一定距离,左边的label距离父容器一定间距,右边的label距离容器右侧一定间隔 要求,两个la ...

  2. ra6m3之adc踩坑日志(基于rt-thread )

    问题描述 1.已经用fsp工具正确配置Pins 2.已经用fsp工具正确配置Stacks 3.问题是根本没有在RT-Thread Studio看到HAL相关的ADC代码,也没看到Settings里边的 ...

  3. C++笔记(9) 异常

    程序有时会遇到运行阶段错误,导致程序无法正常走下去.对于这种问题,处理方法主要有: 1.调用abort() Abort()函数原型位于头文件cstdlib,其典型实现是向标准错误流(即cerr使用的错 ...

  4. 在webpack中运行vue

    网址:https://vue-loader.vuejs.org/zh/ Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件的格式撰写 Vue 组件 安装loa ...

  5. 常见的Linux命令

     在 cmd 命令行 或者终端中             可以运行 node.js 命令 也可以 运行 SQL语句 还可以运行 Linux 命令                          Li ...

  6. ES5的继承语法

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  7. vue自定义指令 - directive

    https://cn.vuejs.org/v2/guide/custom-directive.html 除了核心功能默认内置的指令,Vue也允许注册自定义指令.有的情况下,对普通 DOM 元素进行底层 ...

  8. 史上最强 AI 翻译诞生了!拳打谷歌,脚踢 DeepL

    CoT 推理范式 默认情况下,大语言模型通常是直接给出问题的最终答案,中间推理过程是隐含的.不透明的,无法发挥出大模型最极致的理解能力.如果你用它来充当翻译,可能效果和传统的机器翻译也差不了太多. 如 ...

  9. 2023CSP-S游记

    2023 CSP-S 游记 赛前 上午去花卉市场看了半天花,算是放松放松,主要是为了晚上给干妈过50岁生日. 还以为是 2 点开始,1 点 40 多就到了,然后去买了杯奶茶,然后进场. 结果我是第一考 ...

  10. 不挑电脑安装 WIndows11 用 Rufus这个软件

    下 Rufus 找一个U盘先别动 然后去夸克网盘下载 windows11 24h2 iso 版本的安装文件,陶10块钱加速下载下来 然后安装Rufus 然后使用这个启动盘制作工具选择下载好的 iso原 ...