Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用示例

简介: MainActivity如下:package cc.vv;import java.util.concurrent.LinkedBlockingQueue;import java.
MainActivity如下:
package cc.vv;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import android.os.Bundle;
import android.app.Activity;

/**
 * Demo描述:
 * 线程池(ThreadPoolExecutor)及其拒绝策略(RejectedExecutionHandler)使用示例
 * 
 * 工作原理:
 * 线程池的工作中主要涉及到:corePoolSize,workQueue,maximumPoolSize,RejectedExecutionHandler
 * 它们的调用原理:
 * 1 当线程池中线程数量小于corePoolSize则创建线程,并处理请求
 * 2 当线程池中线程数量等于corePoolSize则把请求放入workQueue中,线程池中的的空闲线程就从workQueue中取任务并处理
 * 3 当workQueue已满存放不下新入的任务时则新建线程入池,并处理请求;
 *   如果线程池中线程数大于maximumPoolSize则用RejectedExecutionHandler使用一定的策略来做拒绝处理
 * 
 * 在该机制中还有一个keepAliveTime,文档描述如下:
 * when the number of threads is greater than the core, 
 * this is the maximum time that excess idle threads will wait for new tasks before terminating.
 * 它是什么意思呢?
 * 比如线程池中一共有5个线程,其中3个为核心线程(core)其余两个为非核心线程.
 * 当超过一定时间(keepAliveTime)非核心线程仍然闲置(即没有执行任务或者说没有任务可执行)那么该非核心线程就会被终止.
 * 即线程池中的非核心且空闲线程所能持续的最长时间,超过该时间后该线程被终止.
 * 
 * 
 * RejectedExecutionHandler的四种拒绝策略
 * 
 * hreadPoolExecutor.AbortPolicy:
 * 当线程池中的数量等于最大线程数时抛出java.util.concurrent.RejectedExecutionException异常.
 * 涉及到该异常的任务也不会被执行.
 * 
 * ThreadPoolExecutor.CallerRunsPolicy():
 * 当线程池中的数量等于最大线程数时,重试添加当前的任务;它会自动重复调用execute()方法
 * 
 * ThreadPoolExecutor.DiscardOldestPolicy():
 * 当线程池中的数量等于最大线程数时,抛弃线程池中工作队列头部的任务(即等待时间最久Oldest的任务),并执行新传入的任务
 * 
 * ThreadPoolExecutor.DiscardPolicy():
 * 当线程池中的数量等于最大线程数时,丢弃不能执行的新加任务
 * 
 * 参考资料:
 * http://blog.csdn.net/cutesource/article/details/6061229
 * http://blog.csdn.net/longeremmy/article/details/8231184
 * http://blog.163.com/among_1985/blog/static/275005232012618849266/
 * http://blog.csdn.net/longeremmy/article/details/8231184
 * http://ifeve.com/java-threadpool/
 * http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
 * http://blog.csdn.net/ns_code/article/details/17465497
 * Thank you very much
 * 
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		testRejectedExecutionHandler();
	}

	// 在此分别测试四种策略,替换ThreadPoolExecutor()方法最后一个参数即可.
	private void testRejectedExecutionHandler() {
		int produceTaskMaxNumber = 10;
		// 构造一个线程池
		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 3,
				TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(3),
				new ThreadPoolExecutor.DiscardPolicy());

		for (int i = 1; i <= produceTaskMaxNumber; i++) {
			try {
				String task = "任务" + i;
				System.out.println("将" + task + "放入线程池");
				threadPoolExecutor.execute(new RunnableImpl(task));
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("AbortPolicy策略抛出异常----> " + e.toString());
			}
		}
	}

	private class RunnableImpl implements Runnable {
		private String taskName;
		private int consumerTaskSleepTime = 2000;

		RunnableImpl(String taskName) {
			this.taskName = taskName;
		}

		public void run() {
			System.out.println("开始 " + taskName);
			try {
				// 模拟耗时任务
				Thread.sleep(consumerTaskSleepTime);
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println("完成 " + taskName);
		}

	}

}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>


相关文章
|
25天前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
5天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
24 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
7天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
24 10
|
5天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
6天前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
19天前
|
监控 负载均衡 算法
线程数突增!领导说再这么写就GC掉我:深入理解与优化策略
【8月更文挑战第29天】在软件开发的世界里,性能优化总是开发者们绕不开的话题。特别是当面对“线程数突增”这样的紧急情况时,更是考验着我们的技术功底和问题解决能力。今天,我们就来深入探讨这一话题,分享一些工作学习中积累的技术干货,帮助大家避免被“GC”(垃圾回收,也常用来幽默地表示“被炒鱿鱼”)的尴尬。
34 2
|
1月前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
37 4
|
18天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
26天前
|
Java 调度
|
27天前
|
Java 测试技术 Android开发
Android项目架构设计问题之构造一个Android中的线程池如何解决
Android项目架构设计问题之构造一个Android中的线程池如何解决
24 0