记一次在StackOverFlow上问问题的经历

最近一直在做测试方面的事情,被测的一些功能需要连接到FTP服务器上。而我在做本地测试时为了方便,就使用java写了一个简单的ftp服务器,可以在命令行下直接启动运行。

当时在main函数里是这样写的。

1
2
3
4
5
6
7
public class App {

    public static void main(String[] args) {
        FtpServer ftpServer = new FtpServer();
        ftpServer.start();
    }
}

然后在命令行运行java -jar ftpserver.jar就可以启动这个FTP服务。一切都很完美。当我想关闭FTP服务时,直接按了Ctrl + C来终止了这个JVM实例。但是我发现ftpserver.jar这个文件删不了了,原因是虽然我终止了该JVM实例,但是FTP服务器并没有被正确的退出。

那么如何实现在按Ctrl+C终止该JVM实例时,能够让程序调用FtpServer中的stop方法来关闭FTP服务?我想在Google上寻找答案,但是连续换了几个关键词都没找到解决方案。

这个时候我都有点差点放弃了,心想反正也不是一个很严重的问题。后来想到不如在StackOverFlow上问一下吧。说实话虽然我经常上StackOverFlow,但是很少在上面问问题。

我在StackOverFlow上发布了这个问题,链接如下。
http://stackoverflow.com/questions/21108059/stop-the-process-when-press-command-c-in-terminal

过了不到20分钟,就收到了一个回答。

从上面可以看出,其实我这个问题之前已经有人问过了,并且收到了满意的答案。我根据回答中提供的链接,很快实现了方法。

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
        final FtpServer ftpServer = new FtpServer();

        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                ftpServer.stop();
            }
        });

        ftpServer.start();
    }

在oracle的官方文档中有对addShutdownHook方法的详细解释。

通过文档可以看出JVM在两种事件下会响应shutdown:

  1. 程序正常退出,比如最后的非后台线程退出或System.exit方法被调用。
  2. 用户终止了JVM,比如按下Ctrl+C,或者登出或关闭系统。

某些情况下JVM是不会响应shutdown的,比如直接用kill命令杀死进程。JVM在shutdown时,会自动触发注册的hook线程,并以并行的方式来运行,JVM并不保证这些hook的调用顺序。

通过这个小事件给了我两个启示:

  1. 当碰到技术困难时,不要轻言放弃,努力找出解决方案。即使找不到完美的解决方案,也要想一些替代方案。
  2. 在StackOverFlow上问问题时不要太着急,先查找下有没有类似的已经解决的问题,这样可以节省时间。
时间: 2024-09-20 00:02:26

记一次在StackOverFlow上问问题的经历的相关文章

记一次Linux服务器上查杀木马经历

开篇前言      Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称 Linux是最安全的操作系统,导致很多人对Linux的安全性有个误解:以为它永远不会感染病毒.木马:以为它没有安全漏洞.所以很多Linux服务器 都是裸奔的.其实在这次事件之前,我对Linux的安全性方面的认识.重视程度也是有所不足的.系统的安全性是相对而言的,没有绝对的安全,风险无处不 在.   案例描述 我 们在云端(中信国际电讯CP

调用接口-求救各位大神,如何下载stackoverflow上的用户数据。

问题描述 求救各位大神,如何下载stackoverflow上的用户数据. 求救各位大神,如何下载stackoverflow上的用户数据(在stackoverflow上注册的用户的公开的信息).若是调用stackoverflow提供的接口,URL是什么? 解决方案 看看stackexchange有提供一些相关数据API 解决方案二: 没有这样的接口,只有自己做爬虫.

我发现:在StackOverflow上拯救歪果仁十分有意思!

菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow,上面汇聚了各路大神的各种精妙解答,不论是java,ios,android,js,.net,各种问题都有解答,当然遇到问题也能上StackOverflow来搜一下,很多问题都能迎刃而解 但是有没有突发奇想来找一些问题来回答呢?个人觉得在上面写写英文还是不错的,一方面保持自己英文水平,虽然说不上提高(曾

PostgreSQL是什么?StackOverflow上开发者最爱和最想要的关系型数据库

**经常会有人问我PostgreSQL是什么? ** 这个问题不太好回答,因为PostgreSQL除了可以让你做到几乎所有其他主流关系型数据库能做的事情外,还可以做到很多别的数据库做不到的事情. 如果非要一个简单直接.便于理解的定义,那么你可以理解为一个开源可自由扩充的Oracle. 尽管这并不是非常准确.因为PostgreSQL对程序员要更友好一些,下图是来自StackOverflow 2017年的一些统计,参考Developer Survey Results 2017: 最想要的数据库 最爱

Stackoverflow上人气最旺的10个Java问题

1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 01 public static void main(String[] args) throws ParseException { 02     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  03     String str3 = "1927-12

【转载】stackoverflow 上关于 rebar 的讨论

[ rebar-include-ext-libs-error ]  Your config file worked for me so I'd suggest doing the following:  make sure you have git installed put the most recent build of rebar in your project directory use a Makefile like the one I described here delete yo

stackoverflow 上一篇关于 多语言国际化的 讨论

记录一下 网址 先.回头再仔细看看. 对了,还想抽时间了解一下关于 json-ld 的知识.

记一次当前工作目录问题的排查经历

最近在使用ClearCase的时候遇到一个问题,当从命令行里启动版本树,并想给一个节点打上review属性时,经常会出现一个命令窗口一闪而过,刷新版本树之后却没能找到想要打的review属性,只有再次尝试才会正确打上.大家忍受了这个问题很久,但一直都没时间去深入分析它.在连续几次遇到这情况之后,我觉得忍无可忍,下定决心解决它,最终找到了问题的根源并给出了解决方案,在这里详细记录一下这次排查的经历. 故事背景 我们使用的版本管理工具是ClearCase,一个集中式(相对于分布式的Git)的商业化配

Swift游戏开发之俄罗斯方块:No.4 滴答作响的时钟机制

为什么标题要叫做"滴答作响的时钟机制"呢? 想必我们大家都玩过俄罗斯方块,那些不同形状的东西,就是哪些不同形状,你懂的,会随着游戏级别的提高而下降的越来越快.是的 ,我们也要模仿那样,做出我们自己的时钟机制. 我们可以看到SKScene里面有一个函数update(currentTime: CFTimeInterval). 这个函数被没一帧所调用.帧,frame, 是什么? 你可以理解一帧就是一副静态的图片,如果很多图片在很短的时间内连续播放,就成了动画.当你的眼睛开始去预知每一帧图像的