总的来说,android有主线程和子线程之分,主线程中只能做一些耗时极短的事(不超过5S,超过5S,触发ANR),比如加载视图,和用户交互等;子线程用于处理耗时任务,比如下载文件,网络请求等。
android系统会在APP启动的时候创建主线程,不会主动创建额外的线程。在开发中有2条规则要遵守:
——不能在 主线程 当中进行耗时的操作,不能阻塞我们的UI Thread;
——不能在 主线程 之外的线程当中操纵我们的UI元素;
这就带来了一个问题,线程间怎么通信?
在 Android当中,提供了两种方式来解决线程直接的通信问题,一种是通过Handler的机制,还有一种就是 AsyncTask 机制。
1.Handler机制
略
2.AsyncTask
AsyncTask:异步任务,从字面上来说,就是在我们的主线程运行的时候,异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当中来执行,并随时将任务执行的结果返回给我们的UI线程来更新我们的UI控件。通过AsyncTask我们可以轻松的解决多线程之间的通信问题。
使用时有几点要注意:
1)AsyncTask需要在主线程实例化,并且调用;
2)只能被执行一次;
3)任务可以取消,调用.cancel方法,但是异步的线程还是会执行完,要终止线程需要另做处理;
关于Thread
1.创建
1)继承thread类
2)实现Runnable接口
2.关于线程安全
Android中的线程一般由Java实现,有Java的join()、wait()、sleep()、notify()等安全方法以及synchronized关键字等。
关于线程池Executors
一个线程池可以创建指定的线程,供程序使用。使用时,直接从线程池中取线程,不需要new了,线程任务完成,进入待命状态;在多任务情况下,能有效的节省资源,避免new thread的无畏开销甚至OOM的发生,并且显著的提升任务的处理效率;
Executors的工厂方法提供的5种不同的线程池,都是.newXXX,自动回收的,固定大小的,调度的,单例的.
Executors有5种不同的线程池:
(java.util.concurrent.Executors-同时进行.执行):
1.ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); // 一个没有限制最大线程数的线程池
2.ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(4);// 限制线程池大小为4的线程池
3.ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(4); // 一个可以按指定时间可周期性的执行的线程池
4.ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();// 每次只执行一个线程任务的线程池
使用时调用他们的execute()方法即可;
ExecutorService executorService = Executors.newFixedThreadPool (5);
executorService.execute(new Runnable() {
@Override
public void run() {
}
});