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.javapackage 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.javapackage 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
- Android中的线程池与任务队列
- Android中的线程池与任务队列
- Android中的线程池与任务队列
- Java 自定义 线程池与任务队列
- Java 自定义 线程池与任务队列
- 线程池任务队列
- 线程池任务队列
- 线程池任务队列
- GCD中的队列与任务
- 最精简的java 线程池与任务队列
- 最精简的java 线程池与任务队列
- java 线程池 任务队列
- JS单线程、任务队列与异步
- 关于线程池实现思考——分离任务队列与线程池
- GCD中的队列与任务组合对比
- Android中的线程与线程池
- Android中的线程与线程池
- 线程池与队列
- 算法应用-韩信点兵
- 个人收集的java精品网站
- NYOJ 464 Cookies
- 判断CPU存储字节大小端的两个程序
- 得到相交的四个点构成四边形
- Android中的线程池与任务队列
- hibenate 批量删除 分析,,,
- 从opencv中学c++
- Qt应用程序过大引起的nfs异常:nfs: server *** not responding 处理方法
- libxml2 xmlTextReader 解析xml实例
- 【系统运维】内存对齐(二)
- c++友元详解
- 整理css常用属性
- C#中的==、Equal、ReferenceEqual