Android中的线程池与任务队列

https://i-blog.csdnimg.cn/blog_migrate/872020273ed2d709ac63eed39cdb193c.png


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

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

实例讲解:
    我们在最初加载的时候,可以new一个线程类,单独线程需要之行的操作。代码如下:
         1.  DownloadTask.java:
[java]  view plain copy
  1. <pre name="code" class="java">package com.threadExecutorService.test;  
  2.   
  3. public class DownloadTask implements Runnable{  
  4.     public String name;  
  5.     public DownloadTask(String name){  
  6.         this.name=name;  
  7.     }  
  8.     @Override  
  9.     public void run() {  
  10. //      String name=Thread.currentThread().getName();  
  11.         try {  
  12.             Thread.sleep(1500);  
  13.         } catch (InterruptedException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.         System.out.println(name + " executed OK!");  
  17.     }  
  18.     public String getFileId(){  
  19.         return name;  
  20.     }  
  21.   
  22. }  
  23. </pre><br>  
  24. <pre></pre>  
  25. <span style="white-space:pre"></span>2.  线程管理类  DownloadTaskManager.java<br>  
  26. <span style="white-space:pre"></span><pre name="code" class="java">package com.threadExecutorService.test;  
  27. import java.util.HashSet;  
  28. import java.util.LinkedList;  
  29. import java.util.Set;  
  30.   
  31. public class DownloadTaskManager {  
  32.     private static final String TAG="DownloadTaskManager";  
  33.     // UI请求队列  
  34.     private LinkedList<DownloadTask> downloadTasks;  
  35.     // 任务不能重复  
  36.     private Set<String> taskIdSet;  
  37.   
  38.     private static DownloadTaskManager downloadTaskMananger;  
  39.   
  40.     private DownloadTaskManager() {  
  41.   
  42.         downloadTasks = new LinkedList<DownloadTask>();  
  43.         taskIdSet = new HashSet<String>();  
  44.           
  45.     }  
  46.   
  47.     public static synchronized DownloadTaskManager getInstance() {  
  48.         if (downloadTaskMananger == null) {  
  49.             downloadTaskMananger = new DownloadTaskManager();  
  50.         }  
  51.         return downloadTaskMananger;  
  52.     }  
  53.   
  54.     //1.先执行  
  55.     public void addDownloadTask(DownloadTask downloadTask) {  
  56.         synchronized (downloadTasks) {  
  57.             if (!isTaskRepeat(downloadTask.getFileId())) {  
  58.                 // 增加下载任务  
  59.                 downloadTasks.addLast(downloadTask);   
  60.             }  
  61.         }  
  62.   
  63.     }  
  64.     public boolean isTaskRepeat(String fileId) {  
  65.         synchronized (taskIdSet) {  
  66.             if (taskIdSet.contains(fileId)) {  
  67.                 return true;  
  68.             } else {  
  69.                 System.out.println("下载管理器增加下载任务:"+ fileId);  
  70.                 taskIdSet.add(fileId);  
  71.                 return false;  
  72.             }  
  73.         }  
  74.     }  
  75.       
  76.     public DownloadTask getDownloadTask() {  
  77.         synchronized (downloadTasks) {  
  78.             if (downloadTasks.size() > 0) {  
  79.                 System.out.println("下载管理器增加下载任务:"+"取出任务");  
  80.                 DownloadTask downloadTask = downloadTasks.removeFirst();  
  81.                 return downloadTask;  
  82.             }  
  83.         }  
  84.         return null;  
  85.     }  
  86. }  
  87. </pre><br>  
  88. <span style="white-space:pre"></span>其中downloadTasks表示的是线程队列,taskIdSet是任务队列,作用就是用来管理线程队列,此程序用的是去重操作。已经下载过的文件,不会再次下载。<br>  
  89. <span style="white-space:pre"></span>3.线程池<br>  
  90. <span style="white-space:pre">DownloadTaskManagerThread</span>.java<br>  
  91. <pre name="code" class="java">/**    
  92.  * @Title: RequestTaskThread.java  
  93.  * @Package com.kingsoft.filesystem  
  94.  * @Description: TODO(用一句话描述该文件做什么)  
  95.  * @author zengzhaoshuai zengzhaoshuai@kingsoft.com    
  96.  * @date 2012-2-25 上午10:35:00  
  97.  * @version V1.0    
  98.  */  
  99. package com.threadExecutorService.test;  
  100.   
  101. import java.util.concurrent.ExecutorService;  
  102. import java.util.concurrent.Executors;  
  103.   
  104.   
  105. public class DownloadTaskManagerThread implements Runnable {  
  106.   
  107.     private DownloadTaskManager downloadTaskManager;  
  108.   
  109.     // 创建一个可重用固定线程数的线程池  
  110.     private ExecutorService pool;  
  111.     // 线程池大小  
  112.     private final int POOL_SIZE = 5;  
  113.     // 轮询时间  
  114.     private final int SLEEP_TIME = 1000;  
  115.     // 是否停止  
  116.     private boolean isStop = false;  
  117.   
  118.     public DownloadTaskManagerThread() {  
  119.         downloadTaskManager = DownloadTaskManager.getInstance();  
  120.         pool = Executors.newFixedThreadPool(POOL_SIZE);  
  121.   
  122.     }  
  123.   
  124.     @Override  
  125.     public void run() {  
  126.         // TODO Auto-generated method stub  
  127.         while (!isStop) {  
  128.             DownloadTask downloadTask = downloadTaskManager.getDownloadTask();  
  129.             if (downloadTask != null) {  
  130.                 pool.execute(downloadTask);  
  131.             } else {  //如果当前未有downloadTask在任务队列中  
  132.                 try {  
  133.                     // 查询任务完成失败的,重新加载任务队列  
  134.                     // 轮询,  
  135.                     Thread.sleep(SLEEP_TIME);  
  136.                 } catch (InterruptedException e) {  
  137.                     // TODO Auto-generated catch block  
  138.                     e.printStackTrace();  
  139.                 }  
  140.             }  
  141.   
  142.         }  
  143.         if (isStop) {  
  144.             pool.shutdown();  
  145.         }  
  146.   
  147.     }  
  148.   
  149.     /** 
  150.      * @param isStop 
  151.      *            the isStop to set 
  152.      */  
  153.     public void setStop(boolean isStop) {  
  154.         this.isStop = isStop;  
  155.     }  
  156.   
  157. }  
  158. </pre><br>  
  159. <span style="white-space:pre"></span>3.测试类:Test.java<br>  
  160. <span style="white-space:pre"></span><pre name="code" class="java">package com.threadExecutorService.test;  
  161.   
  162. public class Test {  
  163.     public static void main(String[] args) {  
  164.         //1.new一个线程管理队列  
  165.         DownloadTaskManager.getInstance();  
  166.         //2.new一个线程池,并启动  
  167.         DownloadTaskManagerThread downloadTaskManagerThread = new DownloadTaskManagerThread();  
  168.         new Thread(downloadTaskManagerThread).start();  
  169.   
  170.         //3.请求下载  
  171.         String []items=new String[]{"向晨宇1","向晨宇2","向晨宇3","向晨宇4","向晨宇5","向晨宇6","向晨宇7","向晨宇1","向晨宇2"};  
  172.   
  173.         for(int i=0;i<items.length;i++){  
  174.             DownloadTaskManager downloadTaskMananger = DownloadTaskManager  
  175.                     .getInstance();  
  176.             downloadTaskMananger.addDownloadTask(new DownloadTask(items[i]));  
  177.             try {  
  178.                 Thread.sleep(2000);  
  179.             } catch (InterruptedException e) {  
  180.                 e.printStackTrace();  
  181.             }  
  182.         }  
  183.     }  
  184. }  
  185. </pre><br>  
  186. 结果如下:<br>  
  187. <span style="white-space:pre"><img src="" alt=""></span><br>  
  188. <br>  
  189. 相同名字并不会继续执行,OK!~<br>  
  190. <br>  
  191. <span style="white-space:pre"></span>【转载请注明出处,违者法律必究】  向晨宇 2012.5.10<br>  
  192. <br>  
  193. <br>  
  194.          
  195. <p></p>  
  196.       
  197.         <div style="padding-top:20px">           
  198.             <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>  
  199.         </div>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值