throttle 技术其实并不提升性能,这个技术主要是防止系统被超过自己不能处理的流量给搞垮了,这其实是个保护机制。使用throttle技术一般来说是对于一些自己无法控制的系统,只要是异步,一般都会有throttle机制。
比如:
在android系统中大量是使用ContentObserver(ContentObserver用于监听数据变化),一般情况会在ContentObserver中的onChange方法作相关查询工作,也就说会生成游标。当某时瞬间游标生成过多(数据库查询极端频繁,但属于正常的插入,而且不能用批量插入),会导致内存不够而被系统自动终止该程序。这时我们就可以使用throttle技术。
代码如下:
public class Throttle {
public static final boolean DEBUG = false; // Don't submit with true
public static final int DEFAULT_MIN_TIMEOUT = 150;
public static final int DEFAULT_MAX_TIMEOUT = 2500;
/* package */ static final int TIMEOUT_EXTEND_INTERVAL = 500;
private static Timer TIMER = new Timer();
private final Clock mClock;
private final Timer mTimer;
/** Name of the instance. Only for logging. */
private final String mName;
/** Handler for UI thread. */
private final Handler mHandler;
/** Callback to be called */
private final Runnable mCallback;
/** Minimum (default) timeout, in milliseconds. */
private final int mMinTimeout;
/** Max timeout, in milliseconds. */
private final int mMaxTimeout;
/** Current timeout, in milliseconds. */
private int mTimeout;
/** When {@link #onEvent()} was last called. */
private long mLastEventTime;
private MyTimerTask mRunningTimerTask;
/** Constructor with default timeout */
public Throttle(String name, Runnable callback, Handler handler) {
this(name, callback, handler, DEFAULT_MIN_TIMEOUT, DEFAULT_MAX_TIMEOUT);
}
/** Constructor that takes custom timeout */
public Throttle(String name, Runnable callback, Handler handler,int minTimeout,
int maxTimeout) {
this(name, callback, handler, minTimeout, maxTimeout, Clock.INSTANCE, TIMER);
}
/** Constructor for tests */
/* package */ Throttle(String name, Runnable callback, Handler handler,int minTimeout,
int maxTimeout, Clock clock, Timer timer) {
if (maxTimeout < minTimeout) {
throw new IllegalArgumentException();
}
mName = name;
mCallback = callback;
mClock = clock;
mTimer = timer;
mHandler = handler;
mMinTimeout = minTimeout;
mMaxTimeout = maxTimeout;
mTimeout = mMinTimeout;
}
private void debugLog(String message) {
Log.d(Logging.LOG_TAG, "Throttle: [" + mName + "] " + message);
}
private boolean isCallbackScheduled() {
return mRunningTimerTask != null;
}
public void cancelScheduledCallback() {
if (mRunningTimerTask != null) {
if (DEBUG) debugLog("Canceling scheduled callback");
mRunningTimerTask.cancel();
mRunningTimerTask = null;
}
}
/* package */ void updateTimeout() {
final long now = mClock.getTime();
if ((now - mLastEventTime) <= TIMEOUT_EXTEND_INTERVAL) {
mTimeout *= 2;
if (mTimeout >= mMaxTimeout) {
mTimeout = mMaxTimeout;
}
if (DEBUG) debugLog("Timeout extended " + mTimeout);
} else {
mTimeout = mMinTimeout;
if (DEBUG) debugLog("Timeout reset to " + mTimeout);
}
mLastEventTime = now;
}
public void onEvent() {
if (DEBUG) debugLog("onEvent");
updateTimeout();
if (isCallbackScheduled()) {
if (DEBUG) debugLog(" callback already scheduled");
} else {
if (DEBUG) debugLog(" scheduling callback");
mRunningTimerTask = new MyTimerTask();
mTimer.schedule(mRunningTimerTask, mTimeout);
}
}
/**
* Timer task called on timeout,
*/
private class MyTimerTask extends TimerTask {
private boolean mCanceled;
@Override
public void run() {
mHandler.post(new HandlerRunnable());
}
@Override
public boolean cancel() {
mCanceled = true;
return super.cancel();
}
private class HandlerRunnable implements Runnable {
@Override
public void run() {
mRunningTimerTask = null;
if (!mCanceled) { // This check has to be done on the UI thread.
if (DEBUG) debugLog("Kicking callback");
mCallback.run();
}
}
}
}
/* package */ int getTimeoutForTest() {
return mTimeout;
}
/* package */ long getLastEventTimeForTest() {
return mLastEventTime;
}
}
分享到:
相关推荐
46)_单向节流阀Throttle check valve_RD1.PDF
Laravel开发-throttle 访问节流控制工具 访问流量控制工具
今天小编要给大家介绍一款专业好用的网络加速软件...采用加速原理是安全有效地更改你的电脑和调制解调器与节流阀,让网速更快而不损坏系统; 下载方便,使用简单; 提供更快的实时网速。 Throttle(网络加速软件)截图
今天小编就为大家分享一篇基于Vue中使用节流Lodash throttle详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
从派生节流Dart库包含“节流”和“反跳”类使用请参阅上的使用演示。节流的例子final Throttling thr = new Throttling (duration : Duration (seconds : 2 ));thr. throttle (() { print ( ' *ping #1' );});await ...
诺言节气门节流诺言一次要n并发诺言。用法 // run 10 promises at a timevar throttle = require ( 'promise-throttle' ) ( 10 ) ;var request = require ( 'request' ) ;var urls = [ ... ] ;var promises = urls ....
ThrottleStop 免费版,尽情使用,永不过期!ThrottleStop 让电脑为性能发烧锁定主频,气绝降频,更可以调节至尊系列处理器的倍频、电压、外频,ThrottleStop 在手,强悍恒持久!
Laravel开发-queue-throttle Laravel Beanstack队列节流阀
ThrottleStop_9.5 笔记本处理器intel超频软件
ThrottleStop确实是一款能最大化使用 SNB平台支持一项名为BD PROCHOT 的技术,它会在CPU和GPU的温度、功耗明显升高时优先降低CPU的频率,以达到控制整机温度及功率保护的目的。 ThrottleStop可以可以关闭BD PROCHOT ...
上传资源的目的是因为之前下载的ThrottleStop8.40版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 保证原版资源无任何修改添加。 throttle...
ThrottleStop使用方法
ThrottleStop是一个酷睿2/酷睿i处理器性能调整工具,以监测和正确的CPU节流,许多笔记本电脑上正在使用的3个主要。左侧的ThrottleStop包含多种选项可以用来绕过CPU节流
防抖和节流
上传资源的目的是因为之前下载的ThrottleStop8.10beta2版本过期了(打开后提示This beta version has now expired.),内网也没有新版,寻找到这个最新版本,上传后以便大家使用。 throttlestop是款防cpu降频软件。...
主要为大家详细介绍了JavaScript 节流函数 Throttle,感兴趣的小伙伴们可以参考一下
throttlestop是电脑cpu性能检测软件。throttlestop主要是为用户实时监测cpu运行性能,并解决笔记玩游戏时温度一高就降频运行迟钝歇菜难题,让玩家能尽情畅玩游戏。 throttlestop功能介绍: 1、用于笔记本调节cpu; 2...
该项目可用于控制节流阀,以从外部提供更多新鲜空气。 例如,某些通风系统在运行某些设备时需要大量的新鲜空气。 当设备运行时,节气门被打开,更多的新鲜空气可以轻松地输送到该设备。 当设备关闭时,节气门关闭。 ...
免除硬超烦恼,好评如潮的软超软件。Throttlestop_CPU鸡血
ThrottleStop8.48是当前最新版本,可以解决8.40版本在使用时提示This beta version has now expired的问题。throttlestop用于防止cpu降频运行,解决电脑cpu达不到最高性能的问题。现在的CPU很智能化,当温度...