浅谈Android中多线程切换的几种方法

  

我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。
  

  

我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式。

  

<强>几点基础

  

多线程切换,大概可以切分为这样几个内容:如何开启多个线程,如何定义每个线程的任务,如何在线程之间互相通信。

  

<强>线程

  

线程可以解决开启多个线程的问题。
  

  

线程是Java中实现多线程的线程类,每个线程对象都可以启动一个新的线程,注意是可以启动,也可以不启动新线程:

        thread.run();//不启动新线程,在当前线程执行   thread.start();//启动新线程。      

另外就存是线程在线程优先级问题,如果为线程设置较高的线程优先级,就有机会获得更多的CPU资源,注意这里也是有机会,优先级高的线程不是必然会先于其他线程执行,只是系统会倾向于给它分配更多的CPU。
  

  

默认情况下,新建的线程和当前线程的线程优先级一致。
  

  

设置线程优先级有两种方式:

        thread.setPriority (Thread.MAX_PRIORITY);//1 ~ 10,通过线程设置   Process.setThreadPriority (Process.THREAD_PRIORITY_BACKGROUND);//-20 ~ 19日,通过进程设置      

这两种设置方式是相对独立的,在Android中,一般建议通过过程进程设置优先级。

  

<强> ThreadPool

  

线程本身是需要占用内存的,开启/销毁过量的工作线程会造成过量的资源损耗,这种场景我们一般会通过对资源的复用来进行优化,针对IO资源我们会做IO复用(例如Http的KeepAlive),针对内存我们会做内存池复用(例如壁画的内存池),针对CPU资源,我们一般会做线程复用,也就是线程池。
  

  

所以,在Android开发中,一般不会直接开启大量的线程,而是会使用ThreadPool来复用线程。

  

<强> Runnable

  

运行的主要解决如何定义每个线程的工作任务的问题。
  可运行是Java中实现多线程的接口,相对线程而言,可接口更容易扩展(不需要单继承),而且,线程本身也是一种可运行:

        公共类线程实现Runnable {      

相比线程而言,可运行不关注如何调度线程,只关心如何定义要执行的工作任务,所以在实际开发中,多使用可接口完成多线程开发。

  

<强>调用

  

可赎回和可运行的基本类似,但是可赎回可以返回执行结果。

  

<强>线程间通信

  

线程和可运行能实现切换到另一个线程工作(可运行需要额外指派工作线程),但它们完成任务后就会退出,并不注重如何在线程间实现通信,所以切换线程时,还需要在线程间通信,这就需要一些线程间通信机制。

  未来

<强>

  

一般来说,如果要做简单的通信,我们最常用的是通过接口回调来实现。
  

  未来就

是这样一种接口,它可以部分地解决线程通信的问题,未来接口定义了,取消等回调函数,当工作线程的任务完成时,它会(在工作线程中)通过回调告知我们,我们再采用其他手段通知其他线程。

        mFuture=new FutureTask (runnable) {   @Override   保护空白做(){//还……是在工作线程里   }   };   之前      

<强>条件/强>

  

条件其实是和锁一起使用的,但如果把它视为一种线程间通信的工具,也说的通。
  

  

因为,条件本身定位就是一种多线程间协调通信的工具,条件可以在某些条件下,唤醒等待线程。

        锁锁=新的ReentrantLock ();   条件notFull=lock.newCondition ();//定义锁的状态   …   而(count==items.length)   notFull.await();//等待条件的状态   …   notFull.signal();//达到条件的状态      

<强>处理

  

其实,最完整的线程间通信机制,也是我们最熟悉的线程间通信机制,莫过于处理程序通信机制,处理器利用线程封闭的ThreadLocal维持一个消息队列,处理器的核心是通过这个消息队列来传递消息,从而实现线程间通信。

  

<强> AsyncTask的多线程切换

  

回顾完多线程的几个基础概念,先来看看简单的多线程切换,Android自带的AsyncTask。

浅谈Android中多线程切换的几种方法