Android的线程和线程池 线程角色
AsyncTask (底层用到线程池,封装了线程池和Handler)
IntentService (底层直接使用线程,服务,后台线程,不容易被杀)
HandlerThread (底层直接使用线程,具有消息循环的线程)
Android中的线程形态 AsyncTask
轻量级异步任务类,线程池中执行后台任务,不太适合执行特别耗时的后台任务。
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 private class DownAsyncTask extends AsyncTask <URL , Integer , Long > { @Override protected void onPreExecute () { super .onPreExecute(); } @Override protected Long doInBackground (URL... urls) { return null ; } @Override protected void onProgressUpdate (Integer... values) { super .onProgressUpdate(values); } @Override protected void onPostExecute (Long aLong) { super .onPostExecute(aLong); } } new DownAsyncTask().execute();
AsyncTask在使用中的限制条件
AsyncTask类必须在主线程中加载,对戏那个必须在主线程中创建
execute方法必须在UI线程中调用
不要在程序中直接调用 onPreExecute(),onPostExecute(),doInBackground和onProgressUpdate()方法
一个AsyncTask对象只能执行一次,即只能调用一次execute方法。否则会报出异常
AsyncTask的工作原理 HandlerThread
继承了Thread,它是一种可以使用Handler的Thread,使用Looper.prepare()来创建消息队列,使用Looper.loop()来开启消息循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public void run () { mTid = Process.myTid(); Looper.prepare(); synchronized (this ) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1 ; }
IntentService
特殊的Service,是一个抽象类,可用于执行后台耗时的任务,优先级比单纯的线程要高很多,不容易被系统杀死。封装了HandlerThread和Handler。
1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public void onCreate () { super .onCreate(); HandlerThread thread = new HandlerThread("IntentService[" + mName + "]" ); thread.start(); mServiceLooper = thread.getLooper(); mServiceHandler = new ServiceHandler(mServiceLooper); }
Android中的线程池 线程池的好处
重用池中的线程,避免线程创建和销毁的性能开销
能有效控制线程池的最大并发数,避免大量的线程之间因为仙湖抢占资源而导致的阻塞现象
能够对线程进行简单的管理
手动创建线程池
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 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();private static final int CORE_POOL_SIZE = Math.max(2 , Math.min(CPU_COUNT - 1 , 4 ));private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1 ;private static final int KEEP_ALIVE_SECONDS = 30 ;private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1 ); @Override public Thread newThread (Runnable r) { return new Thread(r, "ThreadUtil #" + mCount.getAndIncrement()); } }; private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128 ); private static Executor executor = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
线程池的分类
FixedThreadPool
CachedThreadPool
ScheduledThreadPool
SingleThreadExecutor