在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);
...
推荐阅读