您的位置:首页 > 移动开发 > Android开发

Android中的线程池与任务队列

2015-08-17 15:58 483 查看
/article/2419460.html

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

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



实例讲解:

我们在最初加载的时候,可以new一个线程类,单独线程需要之行的操作。代码如下:

1. DownloadTask.java:

[java] view
plaincopy

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: