https://i-blog.csdnimg.cn/blog_migrate/872020273ed2d709ac63eed39cdb193c.png
Android中的线程池与任务队列:
在Android手机开发的时候,考虑的资源问题是必须的。当然我们要注重线程的消耗资源的过程,线程在new的时候最消耗内存开销,而在运行的时候远远小于new的时候的内存开销。故我们可以考虑应用线程池与任务队列去解决线程的消耗问题。
我们在最初加载的时候,可以new一个线程类,单独线程需要之行的操作。代码如下:
1. DownloadTask.java:
- <pre name="code" class="java">package com.threadExecutorService.test;
- public class DownloadTask implements Runnable{
- public String name;
- public DownloadTask(String name){
- this.name=name;
- }
- @Override
- public 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;
- }
- }
- </pre><br>
- <pre></pre>
- <span style="white-space:pre"></span>2. 线程管理类 DownloadTaskManager.java<br>
- <span style="white-space:pre"></span><pre name="code" class="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;
- }
- }
- </pre><br>
- <span style="white-space:pre"></span>其中downloadTasks表示的是线程队列,taskIdSet是任务队列,作用就是用来管理线程队列,此程序用的是去重操作。已经下载过的文件,不会再次下载。<br>
- <span style="white-space:pre"></span>3.线程池<br>
- <span style="white-space:pre">DownloadTaskManagerThread</span>.java<br>
- <pre name="code" class="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);
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (!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 block
- e.printStackTrace();
- }
- }
- }
- if (isStop) {
- pool.shutdown();
- }
- }
- /**
- * @param isStop
- * the isStop to set
- */
- public void setStop(boolean isStop) {
- this.isStop = isStop;
- }
- }
- </pre><br>
- <span style="white-space:pre"></span>3.测试类:Test.java<br>
- <span style="white-space:pre"></span><pre name="code" class="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();
- }
- }
- }
- }
- </pre><br>
- 结果如下:<br>
- <span style="white-space:pre"><img src="" alt=""></span><br>
- <br>
- 相同名字并不会继续执行,OK!~<br>
- <br>
- <span style="white-space:pre"></span>【转载请注明出处,违者法律必究】 向晨宇 2012.5.10<br>
- <br>
- <br>
- <p></p>
- <div style="padding-top:20px">
- <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
- </div>