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

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

最近一直在做测试方面的事情,被测的一些功能需要连接到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

img_339054960e88fe0e9ad8d497e846671b.png

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

img_d102757d4a2e3c5bcb9308784f3de05e.png

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

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上问问题时不要太着急,先查找下有没有类似的已经解决的问题,这样可以节省时间。

相关文章
|
JavaScript 前端开发 编译器
作者所经历过得软件安装及受折磨经历(简练的干货分享)持续更新
作者所经历过得软件安装及受折磨经历(简练的干货分享)持续更新
55 0
|
存储 JSON 前端开发
如何盘点出掘金的年度高赞文章?
我的新年 Flag ,就是掘金等级到达 V4,而对于绝大多数读者来说,新年 Flag 中是否有“学习”这一项呢,对于我来说,我也是,于是就有萌生一个想法,我想统计出掘金的年度高赞文章。
348 1
|
缓存 运维 前端开发
火爆!GitHub 标星 144k 的前后端学习路线,2021 年最新整理,看完后不再迷茫不再徘徊
火爆!GitHub 标星 144k 的前后端学习路线,2021 年最新整理,看完后不再迷茫不再徘徊
5031 2
火爆!GitHub 标星 144k 的前后端学习路线,2021 年最新整理,看完后不再迷茫不再徘徊
|
程序员
话题打卡留言,每日精选10条,大家一起成长!
公众号发起了话题思考打卡赠书活动!然后有位读者建议,把每天打卡优秀的话题思考的留言整理出来,让大家能在最短的时间内看到大家最精彩的留言 。我也觉得这建议非常好,所以小猿就采用了 。以后公众号的次条推文,都是昨日打卡留言最优秀的10条精华 。
162 0
|
Java 程序员 API
Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?
Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?
103 0
x3d
提一下InfoQ
昨天在微信读书中整理了一个“架构师”清单,把InfoQ中文社区这两年发布的电子书整理到了一起,分享给了团队成员。 如果你去研究InfoQ中文社区,就会发现其中一个人与之因缘际会的相遇,相当奇妙。 这个人就是当初的卖桃君,如今的极客邦总裁池建强先生。
x3d
1494 0
|
安全 生物认证 数据安全/隐私保护
|
Android开发 Java JavaScript
我发现:在StackOverflow上拯救歪果仁十分有意思!
菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow,上面汇聚了各路大神的各种精妙解答,不论是java,ios,android,js,.
1163 0