Android中的线程池与任务队列

来源:互联网 发布:python 字典取值 编辑:程序博客网 时间:2024/04/29 19:12

Android中的线程池与任务队列:

            在Android手机开发的时候,考虑的资源问题是必须的。当然我们要注重线程的消耗资源的过程,线程在new的时候最消耗内存开销,而在运行的时候远远小于new的时候的内存开销。故我们可以考虑应用线程池与任务队列去解决线程的消耗问题。

实例讲解:
    我们在最初加载的时候,可以new一个线程类,单独线程需要之行的操作。代码如下:
         1.  DownloadTask.java:
package com.threadExecutorService.test;public class DownloadTask implements Runnable{public String name;public DownloadTask(String name){this.name=name;}@Overridepublic void run() {//String name=Thread.currentThread().getName();try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + " executed OK!");}public String getFileId(){return name;}}

2.  线程管理类  DownloadTaskManager.java
package com.threadExecutorService.test;import java.util.HashSet;import java.util.LinkedList;import java.util.Set;public class DownloadTaskManager {private static final String TAG="DownloadTaskManager";// UI请求队列private LinkedList<DownloadTask> downloadTasks;// 任务不能重复private Set<String> taskIdSet;private static DownloadTaskManager downloadTaskMananger;private DownloadTaskManager() {downloadTasks = new LinkedList<DownloadTask>();taskIdSet = new HashSet<String>();}public static synchronized DownloadTaskManager getInstance() {if (downloadTaskMananger == null) {downloadTaskMananger = new DownloadTaskManager();}return downloadTaskMananger;}//1.先执行public void addDownloadTask(DownloadTask downloadTask) {synchronized (downloadTasks) {if (!isTaskRepeat(downloadTask.getFileId())) {// 增加下载任务downloadTasks.addLast(downloadTask); }}}public boolean isTaskRepeat(String fileId) {synchronized (taskIdSet) {if (taskIdSet.contains(fileId)) {return true;} else {System.out.println("下载管理器增加下载任务:"+ fileId);taskIdSet.add(fileId);return false;}}}public DownloadTask getDownloadTask() {synchronized (downloadTasks) {if (downloadTasks.size() > 0) {System.out.println("下载管理器增加下载任务:"+"取出任务");DownloadTask downloadTask = downloadTasks.removeFirst();return downloadTask;}}return null;}}

其中downloadTasks表示的是线程队列,taskIdSet是任务队列,作用就是用来管理线程队列,此程序用的是去重操作。已经下载过的文件,不会再次下载。
3.线程池
DownloadTaskManagerThread.java
/**    * @Title: RequestTaskThread.java  * @Package com.kingsoft.filesystem  * @Description: TODO(用一句话描述该文件做什么)  * @author zengzhaoshuai zengzhaoshuai@kingsoft.com    * @date 2012-2-25 上午10:35:00  * @version V1.0    */package com.threadExecutorService.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class DownloadTaskManagerThread implements Runnable {private DownloadTaskManager downloadTaskManager;// 创建一个可重用固定线程数的线程池private ExecutorService pool;// 线程池大小private final int POOL_SIZE = 5;// 轮询时间private final int SLEEP_TIME = 1000;// 是否停止private boolean isStop = false;public DownloadTaskManagerThread() {downloadTaskManager = DownloadTaskManager.getInstance();pool = Executors.newFixedThreadPool(POOL_SIZE);}@Overridepublic void run() {// TODO Auto-generated method stubwhile (!isStop) {DownloadTask downloadTask = downloadTaskManager.getDownloadTask();if (downloadTask != null) {pool.execute(downloadTask);} else {  //如果当前未有downloadTask在任务队列中try {// 查询任务完成失败的,重新加载任务队列// 轮询,Thread.sleep(SLEEP_TIME);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}if (isStop) {pool.shutdown();}}/** * @param isStop *            the isStop to set */public void setStop(boolean isStop) {this.isStop = isStop;}}

3.测试类:Test.java
package com.threadExecutorService.test;public class Test {public static void main(String[] args) {//1.new一个线程管理队列DownloadTaskManager.getInstance();//2.new一个线程池,并启动DownloadTaskManagerThread downloadTaskManagerThread = new DownloadTaskManagerThread();new Thread(downloadTaskManagerThread).start();//3.请求下载String []items=new String[]{"向晨宇1","向晨宇2","向晨宇3","向晨宇4","向晨宇5","向晨宇6","向晨宇7","向晨宇1","向晨宇2"};for(int i=0;i<items.length;i++){DownloadTaskManager downloadTaskMananger = DownloadTaskManager.getInstance();downloadTaskMananger.addDownloadTask(new DownloadTask(items[i]));try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}}

结果如下:


相同名字并不会继续执行,OK!~

【转载请注明出处,违者法律必究】  向晨宇 2012.5.10


       

原创粉丝点击