该事例说明了清理工作必须要放在finally块中
package Thread.Interrupting; import java.util.concurrent.TimeUnit; class NeedsCleanup { private final int id; public NeedsCleanup(int ident) { id = ident; System.out.println("NeedsCleanup " + id); } public void cleanup() { System.out.println("Cleaning up " + id); } } class Blocked3 implements Runnable { private volatile double d = 0.0; @Override public void run() { try { while (!Thread.interrupted()) { NeedsCleanup n1 = new NeedsCleanup(1); try { System.out.println("Sleeping"); TimeUnit.SECONDS.sleep(1); // point2 NeedsCleanup n2 = new NeedsCleanup(2); // Guarantee proper cleanup of n2: try { System.out.println("Calculating"); // A time-consuming,non-blocking operation: for (int i = 0; i < 2500000; i++) { d = d + (Math.PI + Math.E) / d; } System.out.println("Finished time-consuming operation"); } finally { n2.cleanup(); } } finally { n1.cleanup(); } System.out.println("Exiting via while() test"); } } catch (InterruptedException e) { System.out.println("Exiting via InterruptedException"); } } } public class InterruptingIdiom { public static void main(String[] args) throws NumberFormatException, InterruptedException { if (args.length != 1) { System.out.println("usage:java InterruptingIdiom delay-in-ms"); System.exit(1); } Thread t = new Thread(new Blocked3()); t.start(); TimeUnit.MILLISECONDS.sleep(new Integer(args[0])); t.interrupt(); } }