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 [email protected]    * @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


更多相关文章

  1. Android下的多线程
  2. Handler解析(一):是如何实现线程之间的切换
  3. android 启动线程注意的问题
  4. Android之Volley框架使用优化--单例模式实现请求队列
  5. android实现多线程断点续传功能
  6. android中执行线程的部分代码
  7. Android实现多线程断点下载的方法
  8. Android线程池(四)ThreadPoolExecutor类源码解析
  9. Android非UI线程更新UI的几种方法

随机推荐

  1. Android(安卓)ExpandableListActivity 学
  2. TextView控件
  3. Flutter 透明状态栏及字体颜色的设置方法
  4. Android输入法遮挡问题的解决思路
  5. Android几种FrameWork(Manager)的用法
  6. MixtureTextView 支持Android图文混排、
  7. android : 如何通过provider向外共享数据
  8. Android(安卓)远程回调
  9. Eclipse,到了说再见的时候了——Android(
  10. Many PC buyers are still untapped pote