文档章节

一个Java细节!

andyqian
 andyqian
发布于 03/05 22:21
字数 593
阅读 2481
收藏 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
粉丝 66
博文 38
码字总数 47816
作品 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

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

这样有利于加深影响。 -----> 加深印象
感谢指正,已修改!
刹那公子
这样有利于加深影响。 -----> 加深印象
IBM和SAP开源其JVM诊断工具

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

JavaGG
2010/03/24
0
0
从分析async-profiler的实现细节来学习jvmti

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

疼丸李白
2017/12/22
0
0
Java OutOfMemoryError 的原因是什么,什么是Java native方法

一、Java OutOfMemoryError 的原因是什么,什么是Java native方法?转载的博文 容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。 常见的几种错误: 1.1 OutO...

Oscarfff
2015/05/15
0
0
Java开发每日复盘2018_0515

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

ZeroOSTalk
05/16
0
0
Java中的native关键字

一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非jav...

摆渡者
2014/03/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
5分钟前
0
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部