我有一个目标,需要定期做一些工作,而目标本身是活的,因此我设计了如下内容。 基本上属于一个主要类别,其中提到在册的Executorservice 案。 举例来说,所有定期工作都是用纸张打脚。
我期望该守则采取下列行动:
- test2 gets called, which create a Main object o1 (within it a ScheduledExecutorService).
- test2 register to print out a line every second on o1.
- test2 returns, o1 becomes garbage.
- System gc kicks in to gc o1, which has a finalize method to shutdown it s local scheduler.
然而,如果我执行这一方案,情况是,该方案将投入使用。 基本上, g头从没有叫 oO1,因此,编程人从未关闭,因此,即使主线已经结束,方案仍然获胜。
现在,如果我对测试2(12)中的“ o1”进行评论,那么该方案就象它应该做的那样,例如所谓的“ g”。 同样,在夸张时,似乎只是在要求列入表格的检察官服务之后。 时间表将产生实际的校对。
任何解释发生了什么?
public class Main {
public static void main(String[] args) throws Exception {
test2();
System.gc();
System.out.println("Waiting for finalize to be called..");
Thread.sleep(5000);
iii
private static void test2() throws Exception {
Main o1 = new Main();
o1.register();
Thread.sleep(5000);
iii
private final ScheduledExecutorService _scheduler = Executors.newSingleThreadScheduledExecutor();
private void register() {
_scheduler.scheduleWithFixedDelay(new Runnable() {
@Override public void run() {
System.out.println("!doing stuff...");
iii
iii, 1, 1, TimeUnit.SECONDS);
iii
@Override
protected void finalize() throws Throwable {
try {
System.out.print("bye");
_scheduler.shutdown();
iii finally {
super.finalize();
iii
iii
iii