zoukankan      html  css  js  c++  java
  • asynctask

    1. future furetask callable

    用来实现线程执行结束之后的回调

     future 接口

    futuretask实现future

    Callable 执行线程耗时操作,并返回结果

    public void run() {
            if (state != NEW ||
                !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                             null, Thread.currentThread()))
                return;
            try {
                Callable<V> c = callable;
                if (c != null && state == NEW) {
                    V result;
                    boolean ran;
                    try {
    //调用callable的call() 方法
                        result = c.call();
                        ran = true;
                    } catch (Throwable ex) {
                        result = null;
                        ran = false;
                        setException(ex);
                    }
                    if (ran)
                        set(result);
                }
            } finally {
                // runner must be non-null until state is settled to
                // prevent concurrent calls to run()
                runner = null;
                // state must be re-read after nulling runner to prevent
                // leaked interrupts
                int s = state;
                if (s >= INTERRUPTING)
                    handlePossibleCancellationInterrupt(s);
            }
        }

    2 asynctask源码

    public AsyncTask() {
            //定义一个线程回调callable对象
            mWorker = new WorkerRunnable<Params, Result>() {
                public Result call() throws Exception {
                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                    return doInBackground(mParams);
                }
            };
    
           
            mFuture = new FutureTask<Result>(mWorker) {
                @Override
                protected void done() {
                    Message message;
                    Result result = null;
    
                    try {
                        result = 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) {
                        message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
                                new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
                        message.sendToTarget();
                        return;
                    } catch (Throwable t) {
                        throw new RuntimeException("An error occured while executing "
                                + "doInBackground()", t);
                    }
    
                    message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                            new AsyncTaskResult<Result>(AsyncTask.this, result));
                    message.sendToTarget();
                }
            }
        }
     public final AsyncTask<Params, Progress, Result> execute(Params... params) {
            return executeOnExecutor(sDefaultExecutor, params);
        }

     private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

     public static final Executor SERIAL_EXECUTOR = new SerialExecutor();

    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 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; }
     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;
     public static final Executor THREAD_POOL_EXECUTOR
                = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                        TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
     private Result postResult(Result result) {
            @SuppressWarnings("unchecked")
            Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                    new AsyncTaskResult<Result>(this, result));
            message.sendToTarget();
            return result;
        }
     private static class InternalHandler extends Handler {
            @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;
                }
            }
        }

    版本区别3.0前后

    3.0之前:

    多线程同时执行,核心线程是5个,最大是128个。同时执行128+10个任务,超出会抛出异常

    3.0之后:

    一个任务执行完毕后才能执行下一个

    通过设置executeOnExecutor 多线程执行任务


    线程池和asynctask何时使用?

    当有大量的任务瞬时出现的时候使用thread

    相关文章:

    Android AsyncTask 源码解析

  • 相关阅读:
    gcc编译器如何生成指定的文件名
    文章如何做伪原创 SEO大神教你几招做"原创"网站文章的心得
    linux命令大全
    SDC文件模版
    lwip:网络数据包读取和解析过程
    离散时间信号与系统
    网络编程杂谈
    TCP segment of a reassembled PDU
    gdb: multiple process debug
    ntp.conf:很少有人提及的事
  • 原文地址:https://www.cnblogs.com/guduey/p/4387720.html
Copyright © 2011-2022 走看看