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,本文略有改动!

相关文章
|
11月前
|
存储 Java 数据库
如何处理线程池关闭时未完成的任务?
总之,处理线程池关闭时未完成的任务需要综合考虑多种因素,并根据实际情况选择合适的处理方式。通过合理的处理,可以最大程度地减少任务丢失和数据不一致等问题,确保系统的稳定运行和业务的顺利开展。
457 64
|
11月前
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
283 62
|
9月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
339 17
|
8月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
360 0
|
9月前
|
存储 监控 Java
JAVA线程池有哪些队列? 以及它们的适用场景案例
不同的线程池队列有着各自的特点和适用场景,在实际使用线程池时,需要根据具体的业务需求、系统资源状况以及对任务执行顺序、响应时间等方面的要求,合理选择相应的队列来构建线程池,以实现高效的任务处理。
354 12
|
11月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
204 12
|
10月前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
11月前
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
11月前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
10月前
|
安全 Java 容器
【JaveEE】——多线程中使用顺序表,队列,哈希表
多线程环境下使用ArrayList(同步机制,写时拷贝),使用队列,哈希表(高频)ConcurrentHashMap(缩小锁粒度,CAS,扩容优化)

热门文章

最新文章