package com.banking.xc.utils.thread; import java.util.ArrayList; import java.util.Collection; import java.util.List; import android.os.Process; import com.banking.xc.config.Configuration; /** * 接受线程池管理的线程 */ public class PooledThread extends Thread { private static ThreadPool sFirstPool;// 第一线程池,任务先进入这个池,执行不连网操作的任务,用于避免多个任务同时执行,界面加载慢。 private static ThreadPool sSecondPool;//第二线程池,暂时只存放json网络请求,用于解决图片占用网络,引起带json请求的功能问题。 private static ThreadPool sThirdPool;// 第三线程池,存放图片和文件下载网络请求 static { sFirstPool = new ThreadPool(Integer.parseInt(Configuration.getProperty(Configuration.MAX_FIRST_POOL_SIZE)), Integer.parseInt(Configuration.getProperty(Configuration.INIT_FIRST_POOL_SIZE))); sSecondPool = new ThreadPool(Integer.parseInt(Configuration.getProperty(Configuration.MAX_SECOND_POOL_SIZE)), Integer.parseInt(Configuration.getProperty(Configuration.INIT_SECOND_POOL_SIZE))); sThirdPool = new ThreadPool(Integer.parseInt(Configuration.getProperty(Configuration.MAX_THIRD_POOL_SIZE)), Integer.parseInt(Configuration.getProperty(Configuration.INIT_THIRD_POOL_SIZE))); sThirdPool.init(); sSecondPool.init(); sFirstPool.init();// 最后初始化,保证子线程优先级最高。 } public static ThreadPool getFirstThreadPool() { return sFirstPool; } public static ThreadPool getSecondThreadPool() { return sSecondPool; } public static ThreadPool getThirdThreadPool() { return sThirdPool; } protected List<Runnable> tasks = new ArrayList();// 任务队列 protected boolean running = false;// 运行标记 protected boolean stopped = false;// 停止标记 protected boolean paused = false;// 暂停标记 protected boolean killed = false;// 结束标记 private ThreadPool pool;// 所属线程池 public PooledThread(ThreadPool pool){ this.pool = pool; } /* * 添加任务 * */ public void putTask(Runnable task){ tasks.add(task); } /*添加任务队列*/ public void putTasks(Collection tasks){ this.tasks.addAll(tasks); } /*移除并返回一个任务*/ protected Runnable popTask(){ if(tasks.size() > 0) return (Runnable)tasks.remove(0); else return null; } public boolean isRunning(){ return running; } /*停止任务*/ public void stopTasks(){ stopped = true; } /*以不断短暂睡眠让出资源的方式来实现停止*/ public void stopTasksSync(){ stopTasks(); while(isRunning()){ try { sleep(5); } catch (InterruptedException e) { } } } /*暂停任务*/ public void pauseTasks(){ paused = true; } /*以不断短暂睡眠让出资源的方式来实现停止*/ public void pauseTasksSync(){ pauseTasks(); while(isRunning()){ try { sleep(5); } catch (InterruptedException e) { } } } /*结束任务*/ public void kill(){ if(!running)// 如果不运行就执行打断 interrupt(); else killed = true;// 如果运行中就标记停止 } /*结束任务*/ public void killSync(){ kill(); while(isAlive()){// 如果是活着就不断地让出资源 try { sleep(5); } catch (InterruptedException e) { } } } /*开始任务*/ public synchronized void startTasks(){ running = true; this.notify();// 唤醒wait本对象的线程. } public synchronized void run(){ Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); try{ while(true){// 要么身为空闲线程时,被打断. if(!running || tasks.size() == 0){// 符合条件就是空闲线程,执行空闲线程的工作 pool.notifyForIdleThread(); wait(); }else{// 繁忙线程 Runnable task; while((task = popTask()) != null){ task.run(); if(stopped){// 每个任务完成后检查停止标记 stopped = false; if(tasks.size() > 0){ tasks.clear();// 放弃了还没执行的任务 break; } } if(paused){// 每个任务完成后检查暂停标记 paused = false; if(tasks.size() > 0){ break; } } } running = false; } if(killed){// 每个任务完成后检查结束标记, killed = false; break;// 退出无限循环,就真的结束了. } } }catch(InterruptedException e){ return; } //System.out.println(Thread.currentThread().getId() + ": Killed"); } }