Java中的closures钩子的有用的例子?

我试图确保我的Java应用程序采取合理的步骤是健壮的,其中的一部分涉及适度closures。 我正在阅读关于closures钩子 ,我实际上并没有得到如何利用它们在实践中。

那里有一个实际的例子吗?

比方说,我有一个非常简单的应用程序,如下所示,它将数字写入一个文件,一行10个,批量为100个,我想确保给定的批处理完成,如果程序中断。 我得到如何注册一个关机挂钩,但我不知道如何将其整合到我的应用程序。 有什么build议么?

package com.example.test.concurrency; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; public class GracefulShutdownTest1 { final private int N; final private File f; public GracefulShutdownTest1(File f, int N) { this.f=f; this.N = N; } public void run() { PrintWriter pw = null; try { FileOutputStream fos = new FileOutputStream(this.f); pw = new PrintWriter(fos); for (int i = 0; i < N; ++i) writeBatch(pw, i); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { pw.close(); } } private void writeBatch(PrintWriter pw, int i) { for (int j = 0; j < 100; ++j) { int k = i*100+j; pw.write(Integer.toString(k)); if ((j+1)%10 == 0) pw.write('\n'); else pw.write(' '); } } static public void main(String[] args) { if (args.length < 2) { System.out.println("args = [file] [N] " +"where file = output filename, N=batch count"); } else { new GracefulShutdownTest1( new File(args[0]), Integer.parseInt(args[1]) ).run(); } } } 

你可以做到以下几点:

  • 让closures挂钩设置一些AtomicBoolean(或挥发性布尔)“keepRunning”为false
  • (可选地,如果在阻塞调用中等待数据,则.interrupt工作线程)
  • 通过调用工作线程上的Thread.join()方法,等待工作线程(在您的情况下执行writeBatch )完成。
  • 终止程序

一些粗略的代码:

  • 添加一个static volatile boolean keepRunning = true;
  • 运行()你改变

     for (int i = 0; i < N && keepRunning; ++i) writeBatch(pw, i); 
  • main()中添加:

     final Thread mainThread = Thread.currentThread(); Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { keepRunning = false; mainThread.join(); } }); 

这大概是我如何在terminal上优雅地“拒绝所有客户端点击Control-C”。


从文档 :

当虚拟机开始其closures序列时,它将以某些未指定的顺序启动所有已注册的closures挂钩,并让它们同时运行。 当所有钩子都完成后,它将运行所有未被引用的终结器,如果退出时已经启用。 最后,虚拟机将停止。

也就是说,一个closures钩子保持JVM运行,直到钩子终止(从run()方法返回。

Shutdown Hooks是在Runtime.addShutdownHook()中注册的未启动的线程,JVM不能保证closures钩子的启动顺序。有关更多信息,请参阅http://techno-terminal.blogspot.in/2015/08 /shutdown-hooks.html