1、主线程来向子线程发送消息的方法
在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了。那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务。如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容。
一、HandlerThread类
主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间。那么我们就来实现一下,看看这样子到底行得通还是行不通。新建项目,修改它的MainActivity的代码,如下即可:
链接:https://www.cnblogs.com/fuly550871915/p/4890066.html
2、主线程与子线程的区别
每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。
线程唯一标示符:Thread.CurrentThread.ManagedThreadID;
- UI界面和Main函数均为主线程。
- 被Thread包含的“方法体”或者“委托”均为子线程。
- 委托可以包含多个方法体,利用this.Invoke去执行。
- 也可以定义多种方法体,放在Thread里面去执行。则此方法体均为子线程。注意如果要修改UI界面的显示。则需要使用this.Invoke,否则会报异常。
Main函数为主线程,id标示符与UI界面主线程相等
以下为测试代码:
https://blog.csdn.net/qq_23833037/article/details/51850264
总结:
1. 什么是子线程?
包含在 Thread thread = new Thread(new ThreadStart(delegate{
}));里面均视为子线程。(个人理解)
2. 什么是主线程?
UI界面和Main函数均为主线程,除了“不包含在Thread里面的程序”均可 视为主线程。(个人理解)线程通信的目的是为了能够让线程之间相互发送信号。另外,线程通信还能够使得线程等待其它线程的信号,比如,线程B可以等待线程A的信号,这个信号可以是线程A已经处理完成的信号。
通过共享对象通信
有一个简单的实现线程之间通信的方式,就是在共享对象的变量中设置信号值。比如线程A在一个同步块中设置一个成员变量
链接代码:https://blog.csdn.net/suifeng3051/article/details/51863010hasDataToProcess
值为true
,而线程B同样在一个同步块中读取这个成员变量。下面例子演示了一个持有信号值的对象,并提供了设置信号值和获取信号值的同步方法: