Android线程全解析

**

背景:已经有主线程,为什么还要设计一个子线程?

**
当程序启动以后,会被自动分配到一个进程和一个主线程,主线主要的职责就是负责界面的刷新工作,每16ms就会收到一个handler发来的来的message 一直不停的进行刷新界面,
所以主线程是不能进行耗时的操作(例如复杂的逻辑运算,超过百条以上的集合数据处理,网络请求,io操作),如果进行了耗时操作,就会直接导致主线程阻塞,也就是常说的卡顿(如果界面卡顿,就一定是有其他处理阻塞了界面的正常刷新),甚至系统直接抛出异常。基于以上的原因爸爸设计了子线程,他是和主线程并行的两条线,并且在合适的时候合并线程。
界面开始100ms以后才会主线程和子线程,所以理论上来说在oncreate里面直接new Thread其实没什么意义,但是又可以使用。

使用:

在不指定jvm线程数请的情况,jvm支持最大线程数5602

 new Thread(new Runnable() {
            @Override
            public void run() {
                //这里进行耗时操作
            }
        }).start();

1、线程开始必须调用start
2、线程结束要调用onstop和interrupt(new Thread中没有死循环也不用手动销毁,系统会自动回收),
3、线程等待和唤醒 wait 和notify
4、线程等级,所有的线程等级默认都是5,有时候很多线程进行操作的时候,后来的线程需要优先执行,这个时候就需要给线程增加一个等级Thread.setPriority()最大是10,注意这个线程优先级只是理论上来说会优先执行,并不是高等级开启以后,直接阻塞其他线程,也就是最大可能先执行他。
5、线程池 Threadpool 和AsyncTask简单来讲就是集合保存了几条线程,随时拿出来使用,我们自己一样可以使用list进行实现

线程切换:怎么从子线程切换到主线程

1、利用handler和进行切换
2、Activity.runUiThread 直接在子线程中使用
3、View.post()及postdelay handler也可以直接post
4、AsyncTask 使用doinbackground和onpost
5、

Rxjava   observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(observableOnSubscribe)

注意事项:

1、线程结束,当界面(activity)结束的以后,一定要将线程结束,特别是如果线程保有其他对象的引用,很容易导致内存泄漏。如果线程中使用到循环(while)的时候,必须把判断条件置为false,这个问题《在线学习》中有复现,线程结束必须在activity调用在super的ondetory之前
2、线程安全 synchronized 当多条线程同时开启使用同一部分代码的时候,必须给线程增加一个锁,将代码块用锁锁起来,当代码被使用的时候,其他线程自动进入等待状态。原因就是cpu其实也是单线程操作,每次cpu只能单一功能进行操作,在实用锁的过程中尽量不要实用嵌套锁,每次只实用一个锁来锁定一个对象,否则容易造成死锁,锁定的代码尽量避免实用过于耗时的操作,如果确定耗时,尽量设置一个备用资源,java有函数判定线程是否是死锁状态
3、两个子线程一样可以通信,做法就是线程1中创建一个handler,然后在线程2中使用handler发消息,当handler收到消息,就可以进行正常逻辑处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值