首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

时间轮原理及其在框架中的应用

同时可以发现有一个剩余周期的概念,这是因为任务C的执行时间为1930ms,超过了时间轮的周期1秒,所以可以标记它的剩余周期为1,当时间轮第一次转动到它的位置时,发现它的剩余周期为1,表示还没有到要处理的时间...当第一层时间轮转动时,任务A和任务B会被先后执行。1秒钟之后,第一层时间轮完成了一个周期转动。...从新开始第0跳,这时第二层时间轮从槽0跳到了槽1处,将槽1处的任务,也就是任务C取出放入到第一层时间轮的槽位9处,当第一层时间轮转动到槽位9处,任务C就会被执行。...当定时任务被取消时,它会首先被暂存到canceledTimeouts队列中。...它会被在构造函数中初始化,当指定为n时,它实际上会取最靠近n的且为2的幂次方值。

2.2K21

2. SOFAJRaft源码分析—JRaft的定时任务调度器是怎么做的?

然后封装一个TimerTask实例,当执行TimerTask的run方法的时候会调用RepeatedTimer实例的run方法。...HashedWheelTimer通过一定的hash规则将不同timeout的定时任务划分到HashedWheelBucket进行管理,而HashedWheelBucket利用双向链表结构维护了某一时刻需要执行的定时任务列表...所以unprocessedTimeouts中的数据只是做一个记录,并不会再次被执行。..., 这个时候就使用当前tick, 也就是放到当前bucket, 此方法调用完后就会被执行 final long ticks = Math.max(calculated, tick); /...因为每一次的指针都会指向bucket中的下一个timeout,所以timeout为空时说明整个链表已经遍历完毕,所以用while循环做非空校验 因为没一次循环都会把当前的轮数大于零的做减一处理,所以当轮数小于或等于零的时候就需要把当前的

56610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于Android中工作者线程的思考

    而本例中,当屏幕旋转时,处于排队的AsyncTask由于其对Activity实例的引用关系,导致这个Activity不能被销毁,其对应的内存不能被GC回收,因而就出现了内存泄露问题。...cancel的问题 AsyncTask作为任务,是支持调用者取消任务的,即允许我们使用AsyncTask.canncel()方法取消提交的任务。然而其实cancel并非真正的起作用。...当我们调用cancel(false),不打断正在执行的任务,对应的结果是 处于doInBackground中的任务不受影响,继续执行 任务结束时不会去调用onPostExecute方法,而是执行onCancelled...对于某些情况下,有可能无法打断正在执行的任务 如下,就是一个cancel方法无法打断正在执行的任务的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19...以一个四核手机为例,当我们持续调用AsyncTask任务过程中 在AsyncTask线程数量小于CORE_POOL_SIZE(5个)时,会启动新的线程处理任务,不重用之前空闲的线程 当数量超过CORE_POOL_SIZE

    75620

    面试Java后端却问我时间轮算法,面试官没想到我看过Dubbo源码!

    在处理到期的定时任务时,会通过 remove() 方法取出,并调用其 expire() 方法执行;对于已取消的任务,通过 remove() 方法取出后直接丢弃;对于未到期的任务,会将 remainingRounds...当指定时间轮槽数为 n 时,会向上取最靠近 n 的 2 次幂值 ?...workerThread 时间轮内部真正执行定时任务的线程。 ? worker 真正执行定时任务的逻辑封装这个 Runnable 对象中。 ?...4 时间轮指针一次转动的执行流程 HashedWheelTimer$Worker.run(): 时间轮指针转动,时间轮周期开始 清理用户主动取消的定时任务,这些定时任务在用户取消时,记录到 cancelledTimeouts...如果时间轮处于停止状态,则执行下面的步骤获取到未被执行的定时任务并加入 unprocessedTimeouts 队列:遍历时间轮中每个槽位,并调用 clearTimeouts() 方法;对 timeouts

    48720

    C# 多线程学习系列四之取消、超时子线程操作

    而不是让它继续执行,消耗资源.让CPU不在把时间和资源花在没有意义的代码上. 2、主线程取消所有子线程执行的简单代码演示和原理分析 (1)、代码演示 static void Main(string...,但是并不会真正的关闭当前线程"); } //因为当主线程传递给辅助线程二一个取消标记,但是上面的if语句块,并没有执行return操作,所以下面的语句还是会继续执行...,但是并不会真正的关闭当前线程"); Console.WriteLine("辅助线程一执行return操作,自己显示的退出,那么接下去的方法都不会被执行"); return;...CancellationTokenSource对象实例,所以无法调用Cancel方法显示取消.所以子线程调用token.IsCancellationRequested属性,该属性永远为false.调用token.CanBeCanceled...4、初始线程(主线程)调用给CancellationTokenSource对象实例的Cancel方法添加回调函数

    1.5K20

    Android 多线程实现方式

    注意: 当AsyncTask 任务被取消时,回调 onCanceled(obj) ,此时 onPostExecute(),不会被调用,AsyncTask 中的 cancel() 方法并不是真正去取消任务...Android 2.3 以前,AsyncTask 线程池容量是 128 ,全局线程池只有 5 个工作线程,如果运用 AsyncTask 对象来执行多个并发异步任务,那么同一时间最多只能有 5 个线程同时运行...它继承自 Service ,并可以处理异步请求,其内部有一个 WorkerThread 来处理异步任务,当任务执行完毕后,IntentService 自动停止。...,后续的任务不会被执行。...,任务会被一次串行执行,执行结束后,服务停止; 多次启动 IntentService ,在所有任务执行结束之前,停止 IntentService ,服务停止,除了当前执行的任务外,后续的任务不会被执行

    89640

    【Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )

    调用 cancel() 方法 , 可以取消异步任务的执行 ; 如果计算完毕 , 该任务无法被取消 ; 使用 Future 的可取消性 : 如果想要 使用 Future 的可取消的特性 , 不提供可用结果...> , 并返回 null 作为基础任务的结果 ; 2、取消任务方法 ---- boolean cancel(boolean mayInterruptIfRunning) 方法 : 尝试取消任务的执行 ;...① 取消失败 : 如果任务已经完成 , 或 已经被取消 , 或 因为其它原因 不能被取消 , 该尝试可能会失败 ; ② 取消成功 : 如果取消成功 , 并且该任务在取消时还没有开始执行 , 该任务之后也不会被执行...计算必须执行完成 , 否则会阻塞直到计算完成 , 才能解除阻塞 ; * * 取消任务执行 : 调用 cancel() 方法 , 可以取消异步任务的执行 ; 如果计算完毕 , 该任务无法被取消 ;..., 或已经被取消 , 或因为其它原因不能被取消 , 该尝试可能会失败 ; * 如果取消成功 , 并且该任务在取消时还没有开始执行 , 该任务之后也不会被执行 ; * 如果任务已经开始执行

    2.1K00

    Python asyncio之协程学习总结

    当task等待future完成时,事件循环会执行一个新task。 取消一项task和取消一个future是不同的。调用cancel()将向封装的协程抛出CancelledError。...仅当封装的协程没有捕获CancelledError异常或抛出CancelledError异常时,cancelled()才会返回True。 如果一个挂起的task被销毁,则其封装的协程不会被执行完。...从something()的视角来看,并没法生取消。但是它的调用者仍然被取消,所以yield from表达式仍然会引发CancelledError。...return_when指示此函数何时返回。它必须是concurrent.futures模块的以下常量之一: FIRST_COMPLETED 当任何future完成或被取消时,函数将返回。...ALL_COMPLETED当所有future结束或被取消时,函数将返回。 这个函数是一个协程。

    940100

    Java多线程学习(八)线程池与Executor 框架

    当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。...1)execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否; 2)submit()方法用于提交需要返回值的任务。...主线程也可以执行FutureTask.cancel(boolean mayInterruptIfRunning)来取消此任务的执行。...如果任何线程在关闭之前的执行期间由于失败而终止, *如果需要执行后续任务,则一个新的线程将取代它。...如果任务的执行遇到异常,则后续的执行被抑制。 否则,任务将仅通过取消或终止执行终止。

    1.1K40

    Dubbo定时任务时间轮(Time Wheel)算法详解

    在处理到期的定时任务时,会通过 remove() 方法取出,并调用其 expire() 方法执行;对于已取消的任务,通过 remove() 方法取出后直接丢弃;对于未到期的任务,会将 remainingRounds...当指定时间轮槽数为 n 时,会向上取最靠近 n 的 2 次幂值 [20201014133316366.png#pic_center] timeouts、cancelledTimeouts HashedWheelTimer...[20201014134832134.png#pic_center] workerThread 时间轮内部真正执行定时任务的线程。...4 时间轮指针一次转动的执行流程 HashedWheelTimer$Worker.run(): 时间轮指针转动,时间轮周期开始 清理用户主动取消的定时任务,这些定时任务在用户取消时,记录到 cancelledTimeouts...如果时间轮处于停止状态,则执行下面的步骤获取到未被执行的定时任务并加入 unprocessedTimeouts 队列:遍历时间轮中每个槽位,并调用 clearTimeouts() 方法;对 timeouts

    3.7K54

    嵌入式Linux:注册线程清理处理函数

    routine: 指向清理函数的函数指针,清理函数没有返回值,并接受一个 void * 类型的参数。 arg: 传递给清理函数的参数,当清理函数执行时,该参数作为 routine() 的输入。...如果为 0,则只移除清理函数而不执行它;如果为非 0,则不仅移除还会执行清理函数。 线程清理函数执行的场景: 当线程调用 pthread_exit()退出时,清理函数会自动执行。...当线程响应取消请求时(如通过 pthread_cancel()取消线程),清理函数会被执行。 当通过非 0 参数调用 pthread_cleanup_pop() 时,栈顶的清理函数会被执行。...当线程调用 pthread_exit() 时,栈中的清理函数按后进先出的顺序执行,因此会先打印 "Cleaning up: Resource 2",再打印 "Cleaning up: Resource...清理函数只会在线程通过 pthread_exit() 或响应取消请求时执行。 如果线程通过 return 语句退出,清理函数不会被执行。

    7910

    Java多线程编程:Callable、Future和FutureTask浅析(多线程编程之四)「建议收藏」

    (get()),取消(cancel()),判断是否完成等操作。...,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;当任务已经完成,执行cancel(…)方法将返回...(2)当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会执行。...当FutureTask处于已启动状态时,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果任务取消成功,cancel(…)返回true;但如果执行cancel(false)...当任务已经完成,执行cancel(…)方法将返回false。

    27510

    Android Handler机制12之Callable、Future和FutureTask

    (三) boolean cancel(boolean mayInterruptIfRunning)方法注释 翻译如下: 尝试去关闭正在执行的任务,如果任务已经完成,或者任务已经被取消,或者任务因为某种原因而无法被取消...当这个任务还没有被执行,则调用此方法会成功,并且这个任务将来不会被执行。如果任务已经开始了,mayInterruptIfRunning这个入参决定是否应该中断该任务。...这个执行结果只能等执行完毕才能获取,如果还未执行完毕则处于阻塞状态。除非调用runAndReset()方法,否则一旦计算完毕后则无法重启启动或者取消。...当 s 时,表明任务仍然在执行且没有被取消,如果它为true,那么走到awaitDone方法。关于awaitDone方法上面已经讲解了,这里就不过阐述了。...3、cancel(boolean)方法 只能取消还没有被执行的任务(任务状态为NEW的任务) public boolean cancel(boolean mayInterruptIfRunning

    73020

    异步编程 - 04 基于JDK中的Future实现异步编程(上)_Future & FutureTask 源码解析

    ---- boolean cancel(boolean mayInterruptIfRunning) 尝试取消任务的执行; 如果当前任务已经完成或者任务已经被取消了,则尝试取消任务会失败; 如果任务还没被执行时调用了取消任务...,则任务将永远不会被执行; 如果任务已经开始运行了,这时候取消任务,则参数mayInterruptIfRunning将决定是否要将正在执行任务的线程中断,如果为true则标识要中断,否则标识不中断; 当调用取消任务后...set、setException、cancel函数设置任务结果时,任务会转换为终止状态; 在任务完成过程中,任务状态可能会变为COMPLETING(当结果被使用set方法设置时),也可能会经过INTERRUPTING...状态(当使用cancel(true)方法取消任务并中断任务时)。...当任务被中断后,任务状态为INTERRUPTED; 当任务被取消后,任务状态为CANCELLED; 当任务正常终止时,任务状态为NORMAL; 当任务执行异常后,任务状态会变为EXCEPTIONAL。

    24040
    领券