IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 实例说明 Android 多线程、多进程与全局变量之间的关系 -> 正文阅读

[移动开发]实例说明 Android 多线程、多进程与全局变量之间的关系

demo 地址?https://github.com/994955138/ConditionVariableDemo.git

我们先给结论,再用实例验证。

结论:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。

1.线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。不过如何处理好同步与互斥是编写多线程程序的难点。

2.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,所以不共享全局变量、静态变量等数据,但这种操作非常昂贵。进程之间的通信需要以通信的方式(IPC)进行。


3.但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

? ? ? ? 首先我们来验证一下多线程之间的全局变量是否是共享的?

for(int threadnum =0; threadnum<5;threadnum++){
    createNewThread(threadnum);
}
private void createNewThread(int threadNum){
        new Thread(){
            @Override
            public void run() {
                super.run();
                    for(int count = 0; count<50; count++){
                        Log.e("MainAcivity","threadNum = " + threadNum+"  mIndex = " + (++Constan.mIndex));
                    }
            }
        }.start();
    }
}

可以看到 mindex的值是累积的,所以多线程的全局变量确实是共享的。至于顺序为什么不是按照递增的,这是由于拼接和打印字符串需要时间,同时其他线程还在操作mindex值,但是mindex值是唯一的,没有重复值。这说明mindex是共享的。

我们加个同步锁看看

可以看出?synchronized 确实可以使代码块在多线程的情况下,同一时间只有一个线程在操作,可见synchronized是一种独占锁(只能有一个线程拿到锁)和悲观锁(先加锁再执行)。至于为什么0线程执行完后是4线程接着执行,而不是1线程接着执行。这大概和JMM的指令重排序有关系,感兴趣的同学可以去研究一下。

?????????我们来看看跨进程的情况,

?

?看日志

?可以看出,跨进程的情况下mindex的值又从1开始计算,所以跨进程的全局变量是不共享的。他们存在于各自进程的内存中。

????????最后跨进程的代码就更健壮吗?我们来尝试一下多线程中有一个线程崩溃的情况

如上代码,如果多线程的情况下一个线程的崩溃不会影响其他线程的话,那么最终的结果应该是大概打印到80万。

看日志

明显没有打印到800000左右。所以一个线程的崩溃导致进程被回收,其他线程失去依赖,也会退出执行。我们来看看跨进程的情况,是否一个进程的崩溃不影响另外一个进程的执行。我们缩小数据规模更方便分析。



看日志

?

?可以看出MainActivity的进程已经死亡,但是MainActivity2的进程依旧活着。并且完成了所有线程任务。

demo 地址?https://github.com/994955138/ConditionVariableDemo.git

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:14:01  更:2022-02-16 13:15:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:21:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码