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>

Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例的更多相关文章

  1. juc线程池原理(五):拒绝策略示例

    概要 拒绝策略介绍 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施.当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭.第二,任务数量超过线程池的最大限制. 线程池 ...

  2. Java-五种线程池,四种拒绝策略,三种阻塞队列(转)

    Java-五种线程池,四种拒绝策略,三种阻塞队列 三种阻塞队列:    BlockingQueue<Runnable> workQueue = null;    workQueue = n ...

  3. 10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)

    1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1) ...

  4. 《Java线程池》:任务拒绝策略

    在没有分析线程池原理之前先来分析下为什么有任务拒绝的情况发生. 这里先假设一个前提:线程池有一个任务队列,用于缓存所有待处理的任务,正在处理的任务将从任务队列中移除.因此在任务队列长度有限的情况下就会 ...

  5. Java并发包线程池之ThreadPoolExecutor

    参数详解 ExecutorService的最通用的线程池实现,ThreadPoolExecutor是一个支持通过配置一些参数达到满足不同使用场景的线程池实现,通常通过Executors的工厂方法进行配 ...

  6. 【Java 多线程】Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

    Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建 ...

  7. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  8. android线程池ThreadPoolExecutor的理解

    android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...

  9. Android 线程池概念及使用

    一:使用线程池的原因 在android开发中经常会使用多线程异步来处理相关任务,而如果用传统的newThread来创建一个子线程进行处理,会造成一些严重的问题: 在任务众多的情况下,系统要为每一个任务 ...

随机推荐

  1. CF209C Trails and Glades(欧拉路)

    题意 最少添加多少条边,使无向图有欧拉回路. n,m≤106 题解 求出每个点的度数 奇度数点需要连一条新边 仅有偶度数点的连通块需要连两条新边 答案为上面统计的新边数 / 2 注意:此题默认以1为起 ...

  2. NOIP 2017 小凯的疑惑(同余类)

    题意 给出两个互质的数a,b问最大的不能被xa+yb(x,y>=0)表示的数.(a,b<=109) 题解 NOIPday1T1一道数论题,不知埋葬了多少人的梦想. 用同余类去解释. 我们依 ...

  3. python Web抓取(一)[没写完]

    需要的模块: python web抓取通过: webbrowser:是python自带的,打开浏览器获取指定页面 requests:从因特网上下载文件和网页 Beautiful Soup:解析HTML ...

  4. P2420 让我们异或吧(树链剖分)

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  5. 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)

    [Solution] 接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP; 设f[i]表示第i个方块作为最上面的最高值; f[y]=max(f[y],f[x]+h[y]) ...

  6. ECNUOJ 2575 Separate Connections

    Separate Connections Time Limit:5000MS Memory Limit:65536KBTotal Submit:421 Accepted:41 Description  ...

  7. ArcGIS api for javascript——地图配置-增加标注到滑动器

    描述 ArcGISTiledMapServiceLayer,这意味着图层有一个在明确的比例的预先渲染的地图切片的cache.能够从tileInfo属性获得图层的的缓存比例数组.这是本例中标注如何被得到 ...

  8. 会变得ActionBar,让你的ActionBar与众不同

    话不多说先看两张图: github地址:https://github.com/Smalinuxer/android-SlideActionBar 原理什么的有时间再讲,或者自行看代码; 兴许还会补充新 ...

  9. SharePoint Search之(五)Query spelling correction— 查询拼写纠正

     Query spelling correction 在使用搜索引擎的时候.假设一不小心输入错误,或者对于某个词语记得不太清楚,搜索引擎会自己主动纠正: 这个功能可以缩短用户的时间,很好用.在Sh ...

  10. UVA 10515 - Powers Et Al.(数论)

    UVA 10515 - Powers Et Al. 题目链接 题意:求出m^n最后一位数 思路:因为m和n都非常大,直接算肯定是不行的,非常easy想到取最后一位来算,然后又非常easy想到最后一位不 ...