欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

在Android线程池里运行代码任务实例

程序员文章站 2022-05-27 10:21:54
本节展示如何在线程池里执行任务。流程是,添加一个任务到线程池的工作队列,当有线程可用时(执行完其他任务,空闲,或者还没执行任务),threadpoolexecutor会从队...

本节展示如何在线程池里执行任务。流程是,添加一个任务到线程池的工作队列,当有线程可用时(执行完其他任务,空闲,或者还没执行任务),threadpoolexecutor会从队列里取任务,并在线程里运行。
本课同时向你展示了如何停止正在运行的任务。

在线程池里的线程上执行任务

在threadpoolexecutor.execute()里传入 runnable对象启动任务。这个方法会把任务添加到线程池工作队列。当有空闲线程时,管理器会取出等待最久的任务,在线程上运行。

复制代码 代码如下:

public class photomanager {
    public void handlestate(phototask phototask, int state) {
        switch (state) {
            // the task finished downloading the image
            case download_complete:
            // decodes the image
                mdecodethreadpool.execute(
                        phototask.getphotodecoderunnable());
            ...
        }
        ...
    }
    ...
}

当threadpoolexecutor启动runnable时,会自动调用run()方法。

中断正在运行的代码

要停止任务,你需要中断任务的进程。你需要在创建任务的时候,保存一个当前线程的handle.
如:

复制代码 代码如下:

class photodecoderunnable implements runnable {
    // defines the code to run for this task
    public void run() {
        /*
         * stores the current thread in the
         * object that contains photodecoderunnable
         */
        mphototask.setimagedecodethread(thread.currentthread());
        ...
    }
    ...
}

要中断线程,调用thread.interrupt()就可以了。提示:线程对象是系统控制的,可以在你的app进程外被编辑。因为这个原因,你需要在中断它前加访问锁,放到一个同步块里:

复制代码 代码如下:

public class photomanager {
    public static void cancelall() {
        /*
         * creates an array of runnables that's the same size as the
         * thread pool work queue
         */
        runnable[] runnablearray = new runnable[mdecodeworkqueue.size()];
        // populates the array with the runnables in the queue
        mdecodeworkqueue.toarray(runnablearray);
        // stores the array length in order to iterate over the array
        int len = runnablearray.length;
        /*
         * iterates over the array of runnables and interrupts each one's thread.
         */
        synchronized (sinstance) {
            // iterates over the array of tasks
            for (int runnableindex = 0; runnableindex < len; runnableindex++) {
                // gets the current thread
                thread thread = runnablearray[taskarrayindex].mthread;
                // if the thread exists, post an interrupt to it
                if (null != thread) {
                    thread.interrupt();
                }
            }
        }
    }
    ...
}

在大多数案例里,thread.interrupt()会马上停止线程。可是,它只会停止在等待的线程,但不会中断cpu或network-intensive任务。为了避免系统变慢,你应该在开始尝试操作前测试等待中断的请求。

复制代码 代码如下:

/*
 * before continuing, checks to see that the thread hasn't
 * been interrupted
 */
if (thread.interrupted()) {
    return;
}
...
// decodes a byte array into a bitmap (cpu-intensive)
bitmapfactory.decodebytearray(
        imagebuffer, 0, imagebuffer.length, bitmapoptions);
...