https://blog.csdn.net/u010105969/article/details/79139208 背景: 有四个线程A、B、C、D。...需求: 在A、B线程执行完之后去执行线程C、D。...实现方式: GCD 1.利用GCD中的barrier 2.利用GCD中的group 2.1 利用在组中所有的线程执行完之后再去执行其他的线程 2.2 利用wait 代码: barrier: ?...for (int i = 0; i < 3; i ++) { NSLog(@”1—%@”,[NSThread currentThread ]); // 子线程...}); }); return; dispatch_group_notify(group, queue, ^{ // 监听组里所有线程完成的情况 dispatch_async(dispatch_get_global_queue
2、紧跟着还有一个报错:本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止,报错如下图所示。...3、之后即便我垂死挣扎,在命令行窗口中不断的重启MySQL服务,但是仍然没有戳到痛点,尝试的步骤有下图为证。 4、随后想当然的硬上进入MySQL,根本就不可能,只能撞南墙,败兴而归。...而且在状态栏的MySQL Notifier中也会弹出提示,如下图所示,MySQL的状态变为从停止变为启动。
2、紧跟着还有一个报错:本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止,报错如下图所示。 ?...3、之后即便我垂死挣扎,在命令行窗口中不断的重启MySQL服务,但是仍然没有戳到痛点,尝试的步骤有下图为证。 ? 4、随后想当然的硬上进入MySQL,根本就不可能,只能撞南墙,败兴而归。 ?...而且在状态栏的MySQL Notifier中也会弹出提示,如下图所示,MySQL的状态变为从停止变为启动。 ?
,而线程栈中的值不是最新的,所以会一直循环,线程并不能停止。...但是本文的意思不在此,不对 stopReqested 加同步关键字是否就不能停止了呢?不是的。...如下就能停止线程的运行: public class StopThread { private static boolean stopRequested; public static void...TimeUnit.SECONDS.sleep(1); stopRequested = true; }} 如上面所示,加了 System.out.println之后,线程能停止了...这种与 volatile 关键字的不同在于,volatile 关键字会强制的保证线程的可见性。而不加这个关键字,JVM 也会尽力去保证可见性,但是如果 CPU 一直有其他的事情在处理,它也没办法。
简介 ---- 在上篇博文中提到了ScheduledThreadPoolExecutor的一个坑:异常信息会丢失,任务不再继续被调度: Java避坑指南:ScheduledThreadPoolExecutor...避坑 下面我们以源码的形式分析这种情况。...: ScheduledThreadPoolExecutor#scheduleAtFixedRate 为例: 当线程池中的核心线程从队列中获取任务执行时: ScheduledThreadPoolExecutor.ScheduledFutureTask...我们看一下如果被调度的任务抛出异常,super.runAndReset()返回true还是fals: 异常发生后,会保存异常,不再抛出,不主动调用Future#get(),异常信息会丢失,调度任务一般不会调用...小结 ---- 使用ScheduledThreadPoolExecutor来周期性的调度任务时,我们一定不要抛出异常,从而导致异常信息丢失,也导致周期性被调度的任务不再继续被调度执行。
转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 欢迎点击访问我的瞎几把整站点:复制未来 在启动mysql服务时出现该错误:...本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止。...然后在bin目录
1、简介 TransmittableThreadLocal 是Alibaba开源的、用于解决 “在使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal...但对于使用线程池等会池化复用线程的组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的ThreadLocal值传递已经没有意义,应用需要的实际上是把 任务提交给线程池时的ThreadLocal...但对于使用线程池等会池化复用线程的组件的情况,线程由线程池创建好,并且线程是池化起来反复使用的;这时父子线程关系的ThreadLocal值传递已经没有意义,应用需要的实际上是把 任务提交给线程池时的ThreadLocal...目前TTL Agent中,修饰了JDK中的线程池实现如下: java.util.concurrent.ThreadPoolExecutor 和 java.util.concurrent.ScheduledThreadPoolExecutor...ScheduledThreadPoolExecutor实现更强壮,并且功能更丰富。 如支持配置线程池的大小(Timer只有一个线程);Timer在Runnable中抛出异常会中止定时执行。
Timer和TimerTask 本文先介绍Java最原始的解决方案:Timer和TimerTask Timer和TimerTask可以作为线程实现的第三种方式,在JDK1.3的时候推出。...可以在程序任何地方调用,甚至在TimerTask中的run方法中调用; 设置Timer对象为null,其会自动终止; 用System.exit方法,整个程序终止。...下面例子: 启动一个timer任务,执行指定次数/时间后停止任务 备注:该示例在某些特殊的场景会很有用的,比如守护监控、守护检查等等 /** * 定时器 * * @author fangshixiang...* (阶段性定时任务) * 备注:若单线程就能搞定,就使用timer即可,若需要多线程环境,请使用JDK5提供的ScheduledThreadPoolExecutor *...构造方法: ScheduledThreadPoolExecutor(int corePoolSize) //使用给定核心池大小创建一个新定定时线程池 ScheduledThreadPoolExecutor
在IE7下,某一个Div的padding-top会让整个div产生padding-bottom样式。在IE8/9、Firefox、Chrome下都是OK。...通过搜索发现是发现问题的答案: 链接地址是:http://w3help.org/zh-cn/causes/RM1010 在项目开发过程中,开发人员为了让div的高度随着内容自动增加,所以经常在div的关闭之前会添加一个类似...所以在需要自动扩展内容的div中嵌入一个,此时最外层不能添加height,达到内容自动扩充。
前言 先推荐阅读此篇: 【小家java】Java定时任务ScheduledThreadPoolExecutor详解以及与Timer、TimerTask的区别(执行指定次数停止任务) 某些时候我们可能需要在某些固定的时间或者是间隔一定的时间连续执行一些任务...,在决定下一次的执行计划时是否要考虑上次任务在什么时间执行完成。...默认情况下PeriodicTrigger使用了fixedDelay模式。...//获取当前活动的线程数 委托给ScheduledThreadPoolExecutor来做得 public int getActiveCount() { if (this.scheduledExecutor...(当然我们这里只放了两个~~~) ConcurrentTaskScheduler 以单个线程方式执行定时任务,适用于简单场景;(以当前线程执行任务。
写在开头 经过上几篇博文的学习,我们知道在Java中可以通过new Thread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止自然终止有两种情况: 1....线程的任务执行完成; 2. 线程在执行任务过程中发生异常。 start之后,如果线程没有走到终止状态,我们该如何停止这个线程呢?...因此,在这里强烈建议大家不要再用stop方法去停止线程了!...().isInterrupted()可能在某些情况下中断失效,所以我们这里自定义一个stop变量,作为线程中断的标识,检测线程启动先对标识位进行判断。...监控任务启动 10 秒后,停止... 任务执行被中断... 与我们的预期一样,监控线程在执行了3个循环的检测任务后,被成功中断调。到这里,我们就成功的、安全的、优雅的停止了一个线程啦!
在这个部分你将了解到下面几个部分: 线程池的基础架构 线程池的原理分析 线程池核心类的源码分析 线程池调优 Executor 我们先看线程池的基础架构图: ?...ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor继承ThreadPoolExecutor并且实现ScheduledExecutorService...其接口定义如下: public interface Future { /** * 试图取消对此任务的执行 * 如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败...* 如果任务已经启动,则 mayInterruptIfRunning 参数确定是否应该以试图停止任务的方式来中断执行此任务的线程 */ boolean cancel(boolean mayInterruptIfRunning...public interface RunnableFuture extends Runnable, Future { //在未被取消的情况下,将此 Future 设置为计算的结果
内存情况逐渐攀升,最终可以看出程序近乎停止。...下面是程序启用和停止的内存情况: ? ? 综上所诉,我们的猜想是正确的。如果消费的速度小于生产的速度,内存随着时间的堆积,很快就能被打满了。...终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。...(corePoolSize); } 在来看看ScheduledThreadPoolExecutor()的构造函数: public ScheduledThreadPoolExecutor(int corePoolSize...附:ThreadFactory简单介绍 ThreadFactory是一个线程工厂。用来创建线程。这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程。
addWorker(command, false)) reject(command); } execute()执行过程: execute方法执行逻辑有这样几种情况: (1)如果当前运行的线程少于...shutdown和shutdownNow还是有不一样的地方: shutdownNow首先将线程池的状态设置为STOP,然后尝试停止所有的正在执行和未执行任务的线程,并返回等待执行任务的列表 shutdown...还是ScheduledThreadPoolExecutor, 在设计时的三个关键要素是:任务、执行者以及任务结果。...任务 在ThreadPoolExecutor和ScheduledThreadPoolExecutor中任务是指实现了Runnable接口和Callable接口的实现类。...任务结果 在ThreadPoolExecutor中提交任务后,获取任务结果可以通过Future接口的类, 在ThreadPoolExecutor中实际上为FutureTask类, 而在ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor下次再讲。...; 在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法...默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把新加入的任务放到缓存队列当中,缓存队列由构造方法中的...极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。 ?...线程的停止 1 单线程停止 Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,因为在发生InterruptedException异常的时候,会清除中断标记。
默认情况下,核心线程会一直存活,但是当将allowCoreThreadTimeout设置为true时,核心线程超时也会回收。...maximumPoolSize参数在构造函数中,maximumPoolSize为线程池所能容纳的最大线程数。...Handler参数任务拒绝策略,当达到最大线程数且队列任务已满时需要执行的拒绝策略拒绝时机首先,拒绝策略是在新建线程池的时候制定的,拒绝时机如下:第一种情况是当我们调用 shutdown 等方法关闭线程池后...第二种情况是线程池没有能力继续处理新提交的任务,也就是工作已经非常饱和的时候。也就是说线程池核心线程满了-> 然后任务队列满了->然后非核心线程也满了,这个时候再提交任务就会触发拒绝策略。...这在某些应用场景中可能不是最佳选择4、缺乏灵活性和透明度使用Executors快捷方法创建的线程池隐藏了许多重要的配置细节,比如线程数量和任务队列类型,这降低了配置的灵活性和透明度使用线程时,可以直接调用
2018年12月12日18:44:53 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一个...$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor...$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor...也就是说,如果使用者抛出异常,ScheduledExecutorService 将会停止线程的运行,而且不会报错,没有任何提示信息。 这就是在日志中和控制台都没有看到打印异常信息的原因。...启动的Java线程无故挂掉的原因是:如果使用者抛出异常,ScheduledExecutorService 将会停止线程的运行,而且不会报错,没有任何提示信息。
实现原理+源码解析 由于ScheduledThreadPoolExecutor是基于线程池实现的。所以了解它的原理之前读者有必要先了解一下Java线程池的实现。...只有任务的时间到了,worker线程才能从延迟队列中获取到任务并执行。 在ScheduledThreadPoolExecutor中,定义了DelayedWorkQueue类来实现延迟队列。...三、Timer和ScheduledThreadPoolExecutor的区别 由于Timer是单线程的,如果一次执行多个定时任务,会导致某些任务被其他任务所阻塞。...而ScheduledThreadPoolExecutor是基于线程池的,可以动态的调整线程的数量,所以不会有这个问题 如果执行多个任务,在Timer中一个任务的崩溃会导致所有任务崩溃,从而所有任务都停止执行...总体来说,Timer除了在版本兼容性上面略胜一筹以外(Timer是jdk1.3就支持的,而ScheduledThreadPoolExecutor在jdk1.5才出现),其余全部被ScheduledThreadPoolExecutor
领取专属 10元无门槛券
手把手带您无忧上云