当前位置:  技术问答>java相关

finalized()问题?

    来源: 互联网  发布时间:2015-06-13

    本文导语:  我在thinking in java 中看到这么一段程序,不明白它的执行顺序是什么样的。 class Chair{   static boolean gcrun=false;   static boolean f=false;   static int created=0;   static int finalized=0;   int i;   Chair(){    i=++created;  ...

我在thinking in java 中看到这么一段程序,不明白它的执行顺序是什么样的。
class Chair{
  static boolean gcrun=false;
  static boolean f=false;
  static int created=0;
  static int finalized=0;
  int i;
  Chair(){
   i=++created;
   if(created==47)
     System.out.println("Created 47");
     }
  protected void finalize(){
    if(!gcrun){
      gcrun=true;
      System.out.println("Beginning to finalize after"+created +"Chairs have been created");
       }
    if(i==47){
      System.out.println("Finalizing Chair #47,"+"Setting flag to stop Chair creation");
      f=true;
      }
    finalized++;
    if(finalized>=created)
      System.out.println("All"+finalized+"finalized");
      }
    }
public class Garbage{
   public static void main(String[] args){
     if(args.length==0) {
       System.out.println("Usage:n"+"java Garbage beforen or:n"+"java Garbage after");
       return;
     }
     while(!Chair.f){
       new Chair();
       
       }
     System.out.println("After all Chairs have been created:n"+"total created="+Chair.created+", total finalized=" +Chair.finalized);
     if(args[0].equals("before")){
        System.out.println("gc():");
        System.gc();
        System.out.println("runFinalization():");
        System.runFinalization();
        }
     System.out.println("bye!");
     if(args[0].equals("after"))
       System.runFinalizersOnExit(true);
      }
}
在while(!Chair.f){
   new Chair();
   ...
   }中,只要不符合条件,就会生成一个new Chair();而Chair构造器中只有一个累加和打印,系统为什么会自动停止循环,protected void finalize()什么时候开始运行?

|
程序改为:
class Chair{
  static boolean gcrun=false;
  static boolean f=false;
  static long created=0;
  static long finalized=0;
  long i;
  Chair(){
         i=++created;
        // System.out.println(created);
         if(created==47)
         System.out.println("Created 47");
         }
  protected void finalize(){
          if(!gcrun){
           gcrun=true;
           System.out.println("Beginning to finalize after"+created +"Chairs have been created");
          }
         if(i==47){
           System.out.println("Finalizing Chair #47,"+"Setting flag to stop Chair creation");
           f=true;
         }
           finalized++;
           if(finalized>=created)
   {
   System.out.println("All"+created+"created");
           System.out.println("All"+finalized+"finalized");}
      }
 }
public class Garbage{
   public static void main(String[] args){
     if(args.length==0) {
       System.out.println("Usage:n"+"java Garbage beforen or:n"+"java Garbage after");
       return;
     }
     while(!Chair.f){
       System.out.print("I LOVE:"+new Chair());
 // ---------------------
       
       }
     System.out.println("After all Chairs have been created:n"+"total created="+Chair.created+", total finalized=" +Chair.finalized);
     if(args[0].equals("before")){
        System.out.println("gc():");
      //  System.gc();
        System.out.println("runFinalization():");
        System.runFinalization();
        }
     System.out.println("bye!");
     if(args[0].equals("after"))
       System.runFinalizersOnExit(true);
      }
}
大家看一看这程序又是什么结果:
不就明白它的执行顺序???。

|
那是因为,虽然生成的对象符合回收条件,但不一定会被马上回收。有可能是,都生成了几千个对象了,才有对象开始被回收。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.lang.model.element枚举modifier的类成员方法: final定义及介绍
  • 浅析final,finally,finalize 的区别
  • java命名空间java.lang.reflect类modifier的类成员方法: final定义及介绍
  • java中final与finally的使用介绍
  • java命名空间javax.crypto类exemptionmechanism的类成员方法: finalize定义及介绍
  • 请教finally关键字的用法
  • java命名空间java.lang类enum<eextendsenum<e>>的类成员方法: finalize定义及介绍
  • try catch finally的执行顺序深入分析
  • java命名空间java.util.zip类deflater的类成员方法: finalize定义及介绍
  • java面向对象基础_final详细介绍
  • java命名空间java.util.zip类inflater的类成员方法: finalize定义及介绍
  • final 与static
  • java命名空间java.awt类printjob的类成员方法: finalize定义及介绍
  • Java中的final关键字详细介绍
  • java命名空间java.awt类graphics的类成员方法: finalize定义及介绍
  • 关于Garbage Collector&Finalize()
  • java命名空间java.util.concurrent类threadpoolexecutor的类成员方法: finalize定义及介绍
  • 请问static和final的区别?!(请路过的前辈赐教!!!)
  • java命名空间java.awt.event类keyevent的类成员方法: vk_final定义及介绍
  • finalize()方法与System.runFinalization()方法有什么区别
  • java命名空间java.awt.image类indexcolormodel的类成员方法: finalize定义及介绍
  • 关于垃圾收集器 finalize是每个类都必须有的吗


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3