文档章节

一个Java细节!

andyqian
 andyqian
发布于 03/05 22:21
字数 593
阅读 2486
收藏 15

本文首发于个人微信公众号《andyqian》,期待你的关注!

前言

  今天我们一起来做个简单有趣的实验。熟悉Java的童鞋,对ScheduledExecutorService 类应该不陌生。不记得的童鞋,先回忆下。

实验一

我们先看下下面这段简单的代码。如下:

public class ExecutoryServiceTest {

        private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);

        public static void main(String[] args){
            executorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                        int[] array  = new int[1];
                        System.out.println("<hello world>");
                        System.out.println(array[1]);
                }},0,2, TimeUnit.SECONDS);
            }
        }

够简单了吧。意思我就不再阐述了。看完别急,我们先回答下面这个问题。

问题一:

请问:上面一共打印了多少个<hello world>

实验二

  看到此处的童鞋,请在评论区给出你第一个实验的答案。紧接着,我们继续看第二个实验。

public class ExecutoryServiceTest {

        private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);

        public static void main(String[] args){
            executorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    try {
                        int[] array = new int[1];
                        System.out.println("<hello world>");
                        System.out.println(array[1]);
                    }catch(Exception ex){
                        ex.printStackTrace();
                    }
                }},0,2, TimeUnit.SECONDS);
            }
        }

问题二:

请问: 实验二中一共打印了多少个<hello world>。

请在评论区中给出你的答案。

分析

  经过上述两个实验后,我们会发现两者的答案并不相同。这是为什么呢?因为在:run()方法中,发生异常后,中断了后续的执行。这是为什么呢?

其实呀,早在:scheduleAtFixedRate()JDK源码中就有这么一段描述:

If any execution of the task encounters an exception, subsequent executions are suppressed.Otherwise, the task will only terminate via cancellation or termination of the executor.

其意思就是告诉我们:如果任何执行任务遇到异常,其后续的操作会被压制。

同样的,在scheduleWithFixedDelay()方法中也有同样的描述。

一点点建议

  1. 在使用scheduleAtFixedRate()scheduleWithFixedDelay()时,run()方法均要在使用try{}catch处理。避免出现定时任务执行若干次后不执行的”怪现象”。

  2. 我们平时在写系统时,无论是使用JDK自带函数,还是对接外部服务。使用时,一定要了解其使用方法。对入参,结果等都充分理解。(不瞒你说,我就出现过很多次没理解充分。导致Bug产生)。

  3. 强烈建议大家都在本机上运行下上面这两段实验的代码。这样有利于加深印象。

最后: 大家晚安

这里写图片描述

 扫码关注,一起进步

个人博客: http://www.andyqian.com

© 著作权归作者所有

共有 人打赏支持
andyqian
粉丝 68
博文 42
码字总数 53699
作品 0
长沙
程序员
私信 提问
加载中

评论(6)

andyqian
andyqian

引用来自“freezingsky”的评论

引用来自“andyqian”的评论

引用来自“freezingsky”的评论

在使用JDK的相关schedule的时候,只要报异常,后续的定时不会再执行,所以,一般会要求对异常处理,需要catch.

对的,如果不加,会出现只执行一次,或执行若干次后,不执行的现象!

回复@andyqian : 曾经看过一个项目,单机定时跑,然后跑着跑着不跑了,一看,用的是jdk的schedule然后没有任何的异常捕获。

哈哈,如果不注意这个细节,估计要花费很长一段时间了
f
freezingsky

引用来自“andyqian”的评论

引用来自“freezingsky”的评论

在使用JDK的相关schedule的时候,只要报异常,后续的定时不会再执行,所以,一般会要求对异常处理,需要catch.

对的,如果不加,会出现只执行一次,或执行若干次后,不执行的现象!

回复@andyqian : 曾经看过一个项目,单机定时跑,然后跑着跑着不跑了,一看,用的是jdk的schedule然后没有任何的异常捕获。
andyqian
andyqian

引用来自“freezingsky”的评论

在使用JDK的相关schedule的时候,只要报异常,后续的定时不会再执行,所以,一般会要求对异常处理,需要catch.

对的,如果不加,会出现只执行一次,或执行若干次后,不执行的现象!
f
freezingsky
在使用JDK的相关schedule的时候,只要报异常,后续的定时不会再执行,所以,一般会要求对异常处理,需要catch.
andyqian
andyqian

引用来自“刹那公子”的评论

这样有利于加深影响。 -----> 加深印象
感谢指正,已修改!
刹那公子
这样有利于加深影响。 -----> 加深印象
Java开发每日复盘2018_0515

今天跟大家分享几个Java小细节: 【1】「for each循环的写法」 【2】「常量 final 写法细节」 【3】「类型转换之String转其他」 下面我们来一个一个说: 【1】「for each循环的写法」 Java中:...

ZeroOSTalk
05/16
0
0
IBM和SAP开源其JVM诊断工具

IBM最近发布了其Java诊断工具套件,该套件包含如下工具:面向Java的产品转储分析器(Dump Analyzer)、处理垃圾收集(GC,即Garbage Collection)的Extensible Verbose Toolkit和Java锁分析器...

JavaGG
2010/03/24
1K
0
Java Synchronized

Java Synchronized 1 引言 在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对synchronized进行了各种优化之后,有些情况下它并不那么重了...

秋风醉了
2016/03/18
0
0
从分析async-profiler的实现细节来学习jvmti

作者: 一字马胡 转载标志 【2017-12-22】 更新日志 厉害的内容分享 在上一篇文章中分享了一个用于分析java应用性能的厉害角色:async-profiler,具体的内容可以参考Java应用性能分析工具:a...

疼丸李白
2017/12/22
0
0
Java本地方法 Native Method

今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接...

哈全文
2012/09/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

追加字节能优化性能

这种方式看起来很神奇,单如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类型来定义队列的头队列Head和尾节点tail,二这个内部类Pad...

无知的小狼
22分钟前
0
0
性能优化(JVM概念及配置)

虚拟机组成 一次编写,到处运行 Java虚拟机是对操作系统的模拟,隔离差异 2018编程语言排行榜 一个复杂的构架 虚拟机的内部概念 运行原理 编译器,解释器执行流程 内存分配-线程模型 栈帧模型...

这很耳东先生
29分钟前
3
0
Scala之初步认识与环境准备

1. 了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚...

飞鱼说编程
50分钟前
4
0
Vue项目分环境打包的实现步骤

在项目开发中,我们的项目一般分为开发版、测试版、Pre版、Prod版。Vue-cli的默认环境一只有dev和prod两个,之前每次要发布测试版或Pre版都是修改了源码中API地址后打包,这样很麻烦。如果能...

peakedness丶
50分钟前
6
0
vue+lowdb+express

搭建流程: 1.安装Node.js; 2.安装npm; 3.安装Express; 搭建流程 npm install -g express 安装 express 生成器 npm install -g express-generator 查看是否安装成功,随便输的一个命令...

Js_Mei
55分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部