线程管理(一)AsyncTask与Thread的差别
来源:互联网 发布:徐州市网络电子备课 编辑:程序博客网 时间:2024/06/06 02:37
AsycTask,做Android的应该都是熟悉的不能再熟悉了,当我们在进行耗时操作的时候,就可以使用这个了
但是有的人就在想,Thread不是也可以开一个子线程进行耗时操作吗?那这两个有什么样的区别呢?
那么一起来看下AsycTask源码啦
public abstract class AsyncTask<Params, Progress, Result> { private static final String LOG_TAG = "AsyncTask"; //获取cpu可用处理器的数量,线程的数量为cpu*2+1比较好 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CORE_POOL_SIZE = CPU_COUNT + 1; private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1; private static final int KEEP_ALIVE = 1; //这里有个创建线程的方法,说明AsyncTask里面是含有Thread的 private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); public Thread newThread(Runnable r) { return new Thread(r, "AsyncTask #" + mCount.getAndIncrement()); } }; //创建一个Linked的队列,先进先出 private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128); //创建线程池啦 public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); /** * An {@link Executor} that executes tasks one at a time in serial * order. This serialization is global to a particular process. */ public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static final int MESSAGE_POST_RESULT = 0x1; private static final int MESSAGE_POST_PROGRESS = 0x2; private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; private static InternalHandler sHandler; private final WorkerRunnable<Params, Result> mWorker; private final FutureTask<Result> mFuture; private volatile Status mStatus = Status.PENDING; private final AtomicBoolean mCancelled = new AtomicBoolean(); private final AtomicBoolean mTaskInvoked = new AtomicBoolean(); //创建一个空数组双端队列容纳16个元素的初始容量 private static class SerialExecutor implements Executor { final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>(); Runnable mActive; public synchronized void execute(final Runnable r) { mTasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (mActive == null) { scheduleNext(); } } //从队列中取出最先的并执行 protected synchronized void scheduleNext() { if ((mActive = mTasks.poll()) != null) { THREAD_POOL_EXECUTOR.execute(mActive); } } } public enum Status { /** * Indicates that the task has not been executed yet. */ PENDING, /** * Indicates that the task is running. */ RUNNING, /** * Indicates that {@link AsyncTask#onPostExecute} has finished. */ FINISHED, } //从这里开始使用Handler机制,用来跟主线程进行交互 private static Handler getHandler() { synchronized (AsyncTask.class) { if (sHandler == null) { sHandler = new InternalHandler(); } return sHandler; } } public static void setDefaultExecutor(Executor exec) { sDefaultExecutor = exec; } public AsyncTask() { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //我们实现的doInBackground方法,就是在这里调用的 return postResult(doInBackground(mParams)); } }; //使用来管理线程的 mFuture = new FutureTask<Result>(mWorker) { //这里就是耗时操作完成了 @Override protected void done() { try { postResultIfNotInvoked(get()); } catch (InterruptedException e) { android.util.Log.w(LOG_TAG, e); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing doInBackground()", e.getCause()); } catch (CancellationException e) { postResultIfNotInvoked(null); } } }; } private void postResultIfNotInvoked(Result result) { final boolean wasTaskInvoked = mTaskInvoked.get(); if (!wasTaskInvoked) { postResult(result); } } //这里就是向主线程发送消息 private Result postResult(Result result) { @SuppressWarnings("unchecked") Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT, new AsyncTaskResult<Result>(this, result)); message.sendToTarget(); return result; } public final Status getStatus() { return mStatus; } protected abstract Result doInBackground(Params... params); protected void onPreExecute() { } @SuppressWarnings({"UnusedDeclaration"}) protected void onPostExecute(Result result) { } @SuppressWarnings({"UnusedDeclaration"}) protected void onProgressUpdate(Progress... values) { } @SuppressWarnings({"UnusedParameters"}) protected void onCancelled(Result result) { onCancelled(); } protected void onCancelled() { } public final boolean isCancelled() { return mCancelled.get(); }public final boolean cancel(boolean mayInterruptIfRunning) { mCancelled.set(true); return mFuture.cancel(mayInterruptIfRunning); } /** * Waits if necessary for the computation to complete, and then * retrieves its result. * * @return The computed result. * * @throws CancellationException If the computation was cancelled. * @throws ExecutionException If the computation threw an exception. * @throws InterruptedException If the current thread was interrupted * while waiting. */ public final Result get() throws InterruptedException, ExecutionException { return mFuture.get(); } public final Result get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { return mFuture.get(timeout, unit); } public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params); } public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params) { if (mStatus != Status.PENDING) { switch (mStatus) { case RUNNING: throw new IllegalStateException("Cannot execute task:" + " the task is already running."); case FINISHED: throw new IllegalStateException("Cannot execute task:" + " the task has already been executed " + "(a task can be executed only once)"); } } mStatus = Status.RUNNING; onPreExecute(); mWorker.mParams = params; exec.execute(mFuture); return this; } //我们调用的new AsycTask(。。).execute就是调用线程池来执行异步任务 public static void execute(Runnable runnable) { sDefaultExecutor.execute(runnable); } protected final void publishProgress(Progress... values) { if (!isCancelled()) { getHandler().obtainMessage(MESSAGE_POST_PROGRESS, new AsyncTaskResult<Progress>(this, values)).sendToTarget(); } } private void finish(Result result) { if (isCancelled()) { onCancelled(result); } else { onPostExecute(result); } mStatus = Status.FINISHED; } private static class InternalHandler extends Handler { public InternalHandler() { super(Looper.getMainLooper()); } @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"}) @Override public void handleMessage(Message msg) { AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj; switch (msg.what) { case MESSAGE_POST_RESULT: // There is only one result result.mTask.finish(result.mData[0]); break; case MESSAGE_POST_PROGRESS: result.mTask.onProgressUpdate(result.mData); break; } } } private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> { Params[] mParams; } @SuppressWarnings({"RawUseOfParameterizedType"}) private static class AsyncTaskResult<Data> { final AsyncTask mTask; final Data[] mData; AsyncTaskResult(AsyncTask task, Data... data) { mTask = task; mData = data; } }}
简单的捋一下,就是通过线程池创建线程执行异步任务,然后通过handler机制,发信息给主线程,让主线程知道现在是出于什么样的状态
区别:1。AsycTask跟Thread的区别就是AsycTask它能管理的线程数量是有限的!
MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
2。AsycTask是使用了Handler机制能跟主线程进行交互,而Thread只是异步操作
那么,如果我们只是进行异步操作不跟主线程进行交互,还需要使用AscyTask吗?
如果我们需要用到很多的异步操作,能使用AsycTask吗?
当然就是不能拉,下一节介绍,我们自己建立一个线程管理器
0 0
- 线程管理(一)AsyncTask与Thread的差别
- AsyncTask(异步)和Thread(线程)的使用与对比
- AsyncTask(异步)和Thread(线程)的使用与对比
- AsyncTask(异步)和Thread(线程)的使用与对比
- AsyncTask(异步)和Thread(线程)的使用与对比
- AsyncTask与Thread的区别
- Thread的run()与start()的差别
- (一)线程管理_6---创建守护线程(deamon thread)
- (一)线程管理_9---线程分组( Thread Group )
- 进程与线程的差别
- 进程与线程的差别
- (一)线程管理_10---Thread Group中处理不可控制的异常
- AsyncTask与Thread+Handler的区别、AsyncTask的使用
- Android中的Thread与AsyncTask的区别
- Android中的Thread与AsyncTask的区别?
- Android中的Thread与AsyncTask的区别
- Android中的Thread与AsyncTask的区别
- Android中的Thread与AsyncTask的区别?
- SwipeRefreshLayout自动刷新的问题
- Bisearch Summary
- udp
- RVM切换ruby版本
- Cookie 和 Session机制详解
- 线程管理(一)AsyncTask与Thread的差别
- 下载Tomcat源码,并作为工程导入到Eclipse中
- 怎样选择(FC-SAN)光纤通道(存储)交换机
- 使用tcmalloc,它的central freelist很多,一直没有释放
- dxmemdata 连接 dbgrideh进行排序
- 用spring的InitializingBean的afterPropertiesSet来初始化
- tomcat7 源码学习(源码导入eclipse)
- 【精品推荐】像极百度传课iOS版,非常赞的教育类应用
- iOS个人整理08-touch触摸事件和手势识别器