Android中的线程池与任务队列

简介:

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

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


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

 1.  DownloadTask.java:

package com.threadExecutorService.download;

public class DownloadTask implements Runnable {

	public String name;
	
	public DownloadTask(String name) {
		this.name = name;
	}
	
	@Override
	public void run() {
		try {
			Thread.sleep(1500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(name + " executed OK!");  
	}
	
	public String getFileId(){  
        return name;  
    } 

}

2 .  线程管理类  DownloadTaskManager.java

package com.threadExecutorService.download;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

/*
 * 其中downloadTasks表示的是线程队列,taskIdSet是任务队列,作用就是用来管理线程队列,此程序用的是去重操作。已经下载过的文件,不会再次下载。
 */
public class DownloadTaskManager {

	//请求线程队列
	private LinkedList<DownloadTask> downloadTasks;
	//任务不能重复
	private Set<String> taskIdSet;
	
	private static DownloadTaskManager downloadTaskManager;
	
	public static synchronized DownloadTaskManager getInstance(){
		if (null == downloadTaskManager) {
			downloadTaskManager = new DownloadTaskManager();
		}
		return downloadTaskManager;
	}
	
	private DownloadTaskManager() {
		downloadTasks = new LinkedList<DownloadTask>();
		taskIdSet = new HashSet<String>();
	}
	
	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;
	}
	
}

3 .线程池

DownloadTaskManagerThread.java

package com.threadExecutorService.download;

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() {
		this.downloadTaskManager = DownloadTaskManager.getInstance();
		pool = Executors.newFixedThreadPool(POOL_SIZE);
	}
    
	@Override
	public void run() {
		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();
		}
		
		
	}
	
	public void setStop(boolean isStop) {  
        this.isStop = isStop;  
    } 

 }

4.测试类:Test.java

package com.threadExecutorService.test;

import com.threadExecutorService.download.DownloadTask;
import com.threadExecutorService.download.DownloadTaskManager;
import com.threadExecutorService.download.DownloadTaskManagerThread;

public class Test {

	public static void main(String[] args) {
		//1.new一个线程管理队列  
		DownloadTaskManager downloadTaskManager = 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.addDownloadTask(new DownloadTask(items[i]));
        	try {  
                Thread.sleep(2000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
		}
        
        
	}

}


结果如下:



相同名字并不会继续执行,OK!

本文代码:http://download.csdn.net/detail/jdsjlzx/8454395


转载自:http://blog.csdn.net/xcysuccess3/article/details/7551720,本文略有改动!

相关文章
|
5天前
|
消息中间件 前端开发 Java
美团面试:如何实现线程任务编排?
线程任务编排指的是对多个线程任务按照一定的逻辑顺序或条件进行组织和安排,以实现协同工作、顺序执行或并行执行的一种机制。 ## 1.线程任务编排 VS 线程通讯 有同学可能会想:那线程的任务编排是不是问的就是线程间通讯啊? 线程间通讯我知道了,它的实现方式总共有以下几种方式: 1. Object 类下的 wait()、notify() 和 notifyAll() 方法; 2. Condition 类下的 await()、signal() 和 signalAll() 方法; 3. LockSupport 类下的 park() 和 unpark() 方法。 但是,**线程通讯和线程的任务编排是
|
6天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
4天前
|
Android开发 Kotlin API
Android插件化探索与发现,kotlin协程切换线程
Android插件化探索与发现,kotlin协程切换线程
|
4天前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
|
4天前
|
Java 测试技术 Python
Python的多线程允许在同一进程中并发执行任务
【5月更文挑战第17天】Python的多线程允许在同一进程中并发执行任务。示例1展示了创建5个线程打印&quot;Hello World&quot;,每个线程调用同一函数并使用`join()`等待所有线程完成。示例2使用`ThreadPoolExecutor`下载网页,创建线程池处理多个URL,打印出每个网页的大小。Python多线程还可用于线程间通信和同步,如使用Queue和Lock。
17 1
|
5天前
|
Android开发
Android中的多线程及AsyncTask的引入,最终入职阿里
Android中的多线程及AsyncTask的引入,最终入职阿里
|
6天前
|
安全 API 数据库
【转】Android线程模型(AsyncTask的使用)
【转】Android线程模型(AsyncTask的使用)
13 1
|
消息中间件 Java API
|
消息中间件 缓存 Java
Android--线程详解
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/50848671 什么是线程? 线程或者线程执行本质上就是一串命令(也是程序代码),然后我们把它发送给操作系统执行。
955 0
|
3天前
|
编解码 数据库 Android开发
安卓应用开发:打造高效用户界面的五大技巧
【5月更文挑战第18天】在竞争激烈的应用市场中,一个流畅且直观的用户界面(UI)对于安卓应用的成功至关重要。本文将探讨五种提升安卓应用用户界面性能的技巧,包括合理布局设计、优化资源使用、利用硬件加速、内存管理以及响应式编程。通过这些方法,开发者可以创建出既美观又高效的应用体验,从而吸引和保留用户。