Android 切换线程的方式[我常用的]

    1. Handler.post[切换至主线程]

    2. new Thread().start()[切换至子线程]

3. 线程池 ThreadPoolExecutor.execute()[切换至子线程]

    4. runOnUiThread[切换至主线程]

然后写代码看一下他们之间的执行关系[代码中一看就清晰了]

package calldead.redwolf.threaddemo;import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** 思考各种切线程方式之间的主从关系*/
public class MainActivity extends AppCompatActivity {private String TAG = "RedWolfChao";//  线程池 1private ThreadPoolExecutor mThreadPoolExecutor =new ThreadPoolExecutor(3, 5, 1,TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(100));//  Handlerprivate Handler mHandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);execThread();}private void execThread() {//  直接执行[主线程]Log.i(TAG, "[Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());//  new Thread[子线程]new Thread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "newThread [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());runOnUiThread(new Runnable() {@Overridepublic void run() {//  子线程中runOnUiThread [主线程]Log.i(TAG, "newThread_runOnUi [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());}});}}).start();//  线程池执行 [子线程]Runnable runnable = new Runnable() {@Overridepublic void run() {Log.i(TAG, "ThreadPoolExecutor [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());//  线程池runOnUi [主线程]runOnUiThread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "ThreadPoolExecutor_runOnUi [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());}});}};mThreadPoolExecutor.execute(runnable);//  直接runOnUi 没啥意义 读源码就知道了 [主线程]runOnUiThread(new Runnable() {@Overridepublic void run() {Log.i(TAG, "runOnUi [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());}});//mHandler.post(new Runnable() {@Overridepublic void run() {Log.i(TAG, "mHandler.post [Name] = " + Thread.currentThread().getName() + " [ID] = " + Thread.currentThread().getId());}});}
}

日志打印如下 ; 

01-11 14:04:10.826 12804-12804/calldead.redwolf.threaddemo I/RedWolfChao: [Name] = main [ID] = 101-11 14:04:10.826 12804-12804/calldead.redwolf.threaddemo I/RedWolfChao: runOnUi [Name] = main [ID] = 101-11 14:04:10.830 12804-12829/calldead.redwolf.threaddemo I/RedWolfChao: ThreadPoolExecutor [Name] = pool-1-thread-1 [ID] = 20801-11 14:04:10.833 12804-12828/calldead.redwolf.threaddemo I/RedWolfChao: newThread [Name] = Thread-207 [ID] = 20701-11 14:04:10.850 12804-12804/calldead.redwolf.threaddemo I/RedWolfChao: mHandler.post [Name] = main [ID] = 101-11 14:04:10.850 12804-12804/calldead.redwolf.threaddemo I/RedWolfChao: ThreadPoolExecutor_runOnUi [Name] = main [ID] = 101-11 14:04:10.850 12804-12804/calldead.redwolf.threaddemo I/RedWolfChao: newThread_runOnUi [Name] = main [ID] = 1

结论 : 

  • 主线程[UI]只有一个

  • 其它子线程可以有任意个

如图 :

附带runOnUiThread源码 : 

注释翻译 :

在UI线程上运行指定的操作。如果当前线程是ui-hread,则立即执行该操作。如果当前线程不是UI线程,则该操作将发布到UI线程的事件队列。

Android 主线程子线程执行关系相关推荐

  1. Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

    前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...

  2. linux_主线程子线程退出关系

    我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 实例代码: #include &q ...

  3. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  4. python threading-单线程 多线程 主线程 子线程 setDeamon join

    python threading-单线程 多线程 主线程 子线程 setDeamon join 单线程 多线程 主线程和子线程 setDaemon() join() 测试多线程下程序运行的时间 创建多 ...

  5. QT 主线程子线程互相传值

    本文实现了主线程给子线程传值.子线程给主线程传值.主线程子线程的互相传值.线程源文件mythread.h..cpp:主线程文件mainwindow.h..cpp;下面程序先从主线程调用子线程,子线程给 ...

  6. android 主线程调用,Android 主线程和线程之间相互发送消息

    通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带L ...

  7. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

    文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...

  8. 多线程经典问题1——主线程子线程交替问题

    提出问题: * 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次.如此循环50次. 分析:这个实际上是非常easy的问题.即子线程r ...

  9. 主线程 子线程死掉_当线程死时,子进程也会死

    我有一个程序可以触发Python计时器来生成子进程.一旦程序终止或终止,这些子进程就应该终止.为了做到这一点,我使用了"prctl hack",它设置了一旦父对象死亡,子对象应该接 ...

最新文章

  1. 关于Windows Vista的系统修复
  2. java库加载,Java:使用依赖项加载共享库
  3. LeetCode 1534. 统计好三元组
  4. python-opencv学习第二章
  5. ARMam3354linux系统开发,ARM板移植Linux系统启动(四)配置Kernel
  6. MATLAB实现香农编码
  7. hi3519模组测试
  8. [渝粤教育] 无锡商业职业技术学院 商务礼仪 参考 资料
  9. 数据类型和运算符(使用Python的AI编程2部1单元2课)
  10. Android Studio:如何使用网格布局将整个界面等比分为三行三列
  11. html有序列表设置混合编码,一组你值得拥有的 Markdown 中混用 HTML 案例
  12. DEDE自动调用轮播图/幻灯片
  13. 0x80073712_处理win10更新提示错误代码“0x80073712”的方法
  14. canvas五彩斑斓的粒子动画js特效
  15. 联通雁飞格物云平台,单片机连接MQTT服务器
  16. 【复杂网络】自学笔记整理
  17. java记事本的撤回_对于记事本,怎样恢复刚刚撤销的?
  18. 收货地址的JavaScript城市三级联动【干货拿走不谢!>_<】
  19. HPE服务器DL380gen9/ Gen10 固件远程升级方法
  20. 计算机毕业设计指北 | 基于springboot+mysql的小区失物招领网站的设计与实现架构设计

热门文章

  1. HashSet及LinkedHashSet源码分析(基于JDK1.6)
  2. 解决在MyEclipse中,process报launching client等待的问题
  3. 【深度学习论文阅读】TCN:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence
  4. 不患人之不己知,患不知人也。
  5. Latex在footnote或在bib中插入链接时出现波浪号~的解决方案
  6. HTML制作3D樱花漫天飞舞及浪漫信封
  7. 小米miui开发版系统获取root权限的方法
  8. 面试分享:专科半年经验面试阿里前端P6+总结
  9. 文本对比,文本差异并排对比显示实现
  10. 解决VMware和VMbox实体机和虚拟机无法复制粘贴的问题