安卓多线程的实现 (2)

  线程池是资源池在线程应用中的一个实例。了解线程池之前我们首先要了解一下资源池的概念。在JAVA中,创建和销毁对象是比较消耗资源的。我们 如果在应用中需要频繁创建销毁某个类型的对象实例,这样会产生很多临时对象,当失去引用的临时对象较多时,虚拟机会进行垃圾回收(GC),CPU在进行 GC时会导致应用程序的运行得不到相应,从而导致应用的响应性降低。

  资源池就是用来解决这个问题,当你需要使用对象时,从资源池来获取,资源池负责维护对象的生命周期。

  了解了资源池,就很好理解线程池了,线程池就是存放对象类型都是线程的资源池。

  我增加了如何在其他线程中创建Handler的例子作为选学,前面都掌握好了的同学可以看一下,如果你需要实现一个跟Main线程类似的消息处理机制,需要其他线程可以跟你的线程通讯,可以通过这种方法实现。

1、问题提出

1)为何需要多线程?

2)多线程如何实现?

3)多线程机制的核心是啥?

4)到底有多少种实现方式?

2、问题分析

1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。

eg:你点击按钮下载一首歌,接着该按钮一直处于按下状态,那么用户体验就很差。

2)多线程实现方式implements Runnable 或 extends Thread

3)多线程核心机制是Handler

4)提供如下几种实现方式

Handler

————————————说明1

创建一个Handler时一定要关联一个Looper实例,默认构造方法Handler(),它是关联当前Thread的Looper。

eg:

我们在UI Thread中创建一个Handler,那么此时就关联了UI Thread的Looper!

这一点从源码中可以看出!

精简代码如下:

public Handler() {

mLooper = Looper.myLooper();

//当前线程的Looper,在Activity创建时,UI线程已经创建了Looper对象

//在Handler中机制中Looper是最为核心的,它一直处于循环读MessageQueue,有

//要处理的Message就将Message发送给当前的Handler实例来处理

1 2 3 4   if (mLooper == null) { throw new RuntimeException( "Can’t create handler inside thread that has not called Looper.prepare()"); }  

//从以上可以看出,一个Handler实例必须关联一个Looper对象,否则出错

1   mQueue = mLooper.mQueue;  

//Handler的MessageQueue,它是FIFO的吗?不是!我感觉应该是按时间先后排列

//的!Message与MessageQueue到底是啥关系?感兴趣可以研究一下源码!

1 2   mCallback = null; }  

在创建一个Handler的时候也可以指定Looper,此时的Looper对象,可以是当前线程的也可以是其它线程的!

Handler只是处理它所关联的Looper中的MessageQueue中的Message,至于它哪个线程的Looper,Handler并不是很关心!

eg:

我们在UI线程中创建了Handler实例,此时传进Worker线程的Looper,此时依然可以进行业务操作!

eg:

--------------------创建工作者线程

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49   private static final class Worker implements Runnable { private static final Object mLock = newObject() ; private Looper mLooper ; public Worker(String name) { final Thread thread = newThread(null,this,name) ; thread.setPriority(Thread.MIN_PRIORITY) ; thread.start() ;synchronized(mLock) { while(mLooper == null) { try { mLock.wait() ; } catch(InterruptedException e) { e.printStackTrace(); } } } } @Override public void run() {synchronized(mLock) { //该方法只能执行一次,一个Thread只能关联一个Looper Looper.prepare() ;mLooper = Looper.myLooper() ; mLock.notifyAll() ; } Looper.loop() ; } public Looper getLooper(){ return mLooper ; } public void quit() { mLooper.quit() ; } }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdsgs.html