android 线程等待导致死锁 本是古典 何须时尚 2023-09-26 10:09 24阅读 0赞 ## 问题 ## android 线程等待导致死锁 ### 详细问题 ### 为保证线程同步, 使用CountDownLatch倒计时类。主线程等待CountDownLatch倒计时归零程序继续执行 相关代码 为了便于理解, 笔者将问题核心代码提取出来, 如下 package com.example.electronicmall.test.User; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.example.electronicmall.R; import java.util.concurrent.CountDownLatch; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.user_main_activity); final CountDownLatch latch = new CountDownLatch(1); new Thread(new Runnable() { @Override public void run() { // 数据请求线程 MainActivity.this.runOnUiThread(new Runnable() { @Override public void run() { // 页面更改线程 设计主界面更改 latch.countDown(); } }); latch.countDown(); } }).start(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } ### 解决方案 ### 对于页面更改线程, 调用主线程mHandler的post(Runnabler)方法实现主界面更改 即将上述代码改为 package com.example.electronicmall.test.User; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import androidx.appcompat.app.AppCompatActivity; import com.example.electronicmall.R; import java.util.concurrent.CountDownLatch; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.user_main_activity); final CountDownLatch latch = new CountDownLatch(1); // 数据请求线程 new Thread(new Runnable() { @Override public void run() { // 页面更改线程 // MainActivity.this.runOnUiThread(new Runnable() { // @Override // public void run() { // // 页面更改线程 // latch.countDown(); // } // });// // 页面更改线程 Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { } }); latch.countDown(); } }); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } ### 原因 ### ##### 死锁原因 ##### android为每个Activity分配一个主进程, 即Activity.this.runOnUiThread, 出错代码为主进程等待 主进程, 导致死锁 ##### 为何调用主线程mHandler的post(Runnabler)方法实现主界面更改 ##### 若调用Activity.this.runOnUiThread线程导致死锁 若调用runOnUiThread线程由于涉及主页面修改,android 认为该操作不安全, 控制台报错 对于非主线程修改主界面, android 通过调用主线程mHandler的post(Runnabler)方法实现 实现原理 该方法中的Runnable对象会被会加入到mHandler所在线程的Message消息队列中,假设mHandler在主线程中则Runnable 对象中的run方法将会在主线程中运行。所以能够达到更新UI线程的目的。 ### 参考文献 ### [Android开之在非UI线程中更新UI][Android_UI_UI] 原创不易 转载请标明出处 如果对你有所帮助 别忘啦点赞支持哈 ![在这里插入图片描述][9cb4cb80a18345158f8a69e2f196e5b9.png] [Android_UI_UI]: https://www.likecs.com/show-305878067.html [9cb4cb80a18345158f8a69e2f196e5b9.png]: https://img-blog.csdnimg.cn/9cb4cb80a18345158f8a69e2f196e5b9.png
相关 android 线程等待导致死锁 问题 android 线程等待导致死锁 详细问题 为保证线程同步, 使用CountDownLatch倒计时类。主线程等待CountDownLatch倒计时归零程序 本是古典 何须时尚/ 2023年09月26日 10:09/ 0 赞/ 25 阅读
相关 Java规避线程死锁:终止线程循环等待 测试用储户实体类: package domain; import java.util.ArrayList; / 规避死 短命女/ 2022年11月19日 11:23/ 0 赞/ 186 阅读
相关 线程死锁 线程死锁是多线程中最头疼的问题,一旦进入线程死锁,很多时候只能通过外部进程重启才能解决问题 线程到达死锁的四个条件: 互斥条件:一个资源每次只能被一个线程使用 资源独占条 港控/mmm°/ 2022年08月21日 14:43/ 0 赞/ 231 阅读
相关 线程死锁 一、死锁概念 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便 一时失言乱红尘/ 2022年06月14日 09:12/ 0 赞/ 286 阅读
相关 线程死锁 简述: 星期一,新的的一周开始,天气晴朗,风和日丽。本是一个非常不错的心情,突然微信头像闪烁,果不其然又爬虫出问题了,可谓是一入爬虫深似海,项目稳定才见鬼。 墨蓝/ 2022年06月08日 06:30/ 0 赞/ 287 阅读
相关 线程死锁 虽然同步锁机制解决了线程安全问题,但是也带来一些弊端: 1. 效率会降低,每次都需要判断锁的状态 2. 可能引发死锁(彼此占用所需要的资源),出现的概率非常小, 叁歲伎倆/ 2022年05月08日 02:38/ 0 赞/ 273 阅读
相关 线程死锁 先简单用生活列子介绍死锁, 2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都 ╰半夏微凉°/ 2022年04月08日 13:00/ 0 赞/ 307 阅读
相关 多线程2(线程安全,线程同步,死锁,lock锁,等待唤醒机制) 2.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的, 怼烎@/ 2022年01月05日 13:21/ 0 赞/ 377 阅读
相关 线程死锁 ![20190811092629898.png][] package com.vince; / 多线程要进行资源的共享,就需要同步,但同步过多,就 ゞ 浴缸里的玫瑰/ 2021年10月18日 09:36/ 0 赞/ 465 阅读
还没有评论,来说两句吧...