new Thread(){ @Override public void run() { super.run(); System.out.println("我是Thread的匿名实现"); } }.start();直接采用匿名类的方式创建然后复写run方法即可实现简单方便快捷,缺点,每次实现都需要重新编写run方法。
常规方式即继承Thread和匿名Thread实现的对比

3.3实现Runnable接口
public class MyThreadRunnable implements Runnable{ @Override public void run() { System.out.println("线程名字:"+this.getClass().getName()+"---"+i); } }编写MyThreadRunnable并实现Runnable接口,然后复写run方法即可实现。
虽然这里是通过实现Runnable接口实现多线程,但是实现Runnable的方式,最终还是通过Thread类对象来创建线程,即实现了Runnable接口的类,称为线程辅助类;Thread类才是真正的线程类
3.4Runnable匿名实现
Runnable runnable = new Runnable() { @Override public void run() { System.out.println("我是匿名Runnable"); } }; Thread thread = new Thread(runnable); thread.start();首先创建Runnable的实例,然后创建Thread的实例并把runnable当做参数传入最后调用thread.start方法即可使用。
常规实现即用Runnable接口和匿名实现的对比如下

下面是继承Thread类和实现Runnable接口的对比

3.5Handler.sendMessage()
Handler的介绍
上面应该是比较常见的两种实现多线程的方式,而这里是通过Handle来实现的,可能有人会问,为什么android多线程的需要handle?handle有什么作用?其实handle大有作为了,它不仅可以作为信息传递的媒介和好帮手,同时也是多线程的一把好手。
在 Android 中,多线程编程通常涉及到线程之间的通信和消息传递。Handler 是 Android 提供的一个机制,用于线程之间的消息传递和处理。
以下是 Handler 的几个主要作用:
- 线程间通信:在多线程编程中,我们可能需要在一个线程中触发另一个线程执行某些任务。通过 Handler,我们可以发送消息或者 post Runnable 到目标线程的消息队列中,从而实现线程间的通信。
- 消息处理:Handler 可以用来接收和处理消息。当有消息到达线程的消息队列时,Handler 会将消息取出并根据需要进行处理。这样可以方便地在特定的线程中执行相应操作,例如更新 UI、执行耗时操作等。
- 定时任务:Handler 可以与定时器 Timer 结合使用,实现定时任务。通过发送延迟消息或周期性消息,我们可以在指定的时间间隔内执行特定的任务,从而实现定时功能。
- 主线程操作:在 Android 中,UI 操作必须在主线程(UI 线程)上执行。通过在主线程中创建 Handler,并将其与 Looper 关联,就可以在其他线程中发送消息到主线程的消息队列中,从而实现在主线程上执行操作,例如更新 UI 界面。
总之,Handler 在 Android 多线程编程中起着关键的作用,它提供了一种安全、方便的线程间通信和消息处理机制,使得在多线程环境下更容易实现任务调度和UI操作。
有关Handler的相关基本调用说明

public class MyHandle extends Handler{ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); System.out.println(msg); } }myHandle = new MyHandle(); Message message = Message.obtain(); message.what=1; message.obj = "我是Handle的Obj"; myHandle.sendMessage(message);msg.what 消息标识
msg.obj 消息内容存放
这里是对Handler类的继承然后复写handleMessage方法来实现的。通过实例化MyHandle类并实例化Message,然后设置message中传递信息的内容以及消息的标识,最后调用sendMessage发送消息。
当然,上面都有匿名实现,handler也是有的。
private Handler handler = new Handler(){ @Override public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) { return super.sendMessageAtTime(msg, uptimeMillis); } };Message message = Message.obtain();
message.what=1;
message.obj = “内容填写”;
handle.sendMessage(message);
3.6Handler.post()
myHandle.post(new MyRunnable(){ @Override public void run() { super.run(); System.out.println("Handle.post的使用方法"); } });这里和上面一样需要实例化一个Handler,当然你会说,都需要通过继承handler实现,那这二者是不是不一样呢?其实看过源码你会发现,二者还是有区别的,在底层会检查你是通过sendmessage方法实现的还是通过post实现的,根据你实现的方式会去调用不一样的方法来实现的。
最后
目前已经更新的部分资料:



网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
本文详细介绍了Android中实现多线程的多种方式,包括实现Runnable接口、匿名实现、Handler.sendMessage()和Handler.post()。重点讨论了Handler在多线程通信和消息处理中的重要作用,以及如何通过Handler进行线程间的消息传递和UI操作。同时,文章提到了线程间通信的重要性,并鼓励读者系统学习和深入研究相关知识。
726

被折叠的 条评论
为什么被折叠?



