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>
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>
相关文章推荐
- android 剪切图片
- Android API指南(二)自定义控件04之 位置说明
- 【译】Android主题动态切换开源库Prism基本原理3-搭配Palette使用
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX
- Android官网恢复(重新创建)Activity文档翻译:Recreating an Activity
- Android错误之--Error retrieving parent for item: No resource found that matches the given name 'Theme.A
- Android Static分析
- Android开源--MenuDrawer
- Android内容提供者(Content provider)
- Android : View.getWidth() 和 view.getHeight() 返回0
- Android4.4 Wi-Fi P2P WifiP2pService中消息处理
- Android系统权限管理
- Android 软键盘遮挡三种解决方案
- Android绘制波浪曲线,效果很赞的。
- 【Android进阶】(3)Android图像处理
- Android 通过inputstream 加载非Drawable 文件夹下的 .9 path 图片
- Android任务、启动模式、返回栈解析
- 如何Android中自定义Navigationbar
- Android开发中实现两次按返回键退出
- Android Activity动画