看来 ,你只有把这些 需要同样处理的对象 都自己管理, 比如上面说的 ,自己写个类,里面包括一个集合, 虫子都只会在这个集合里,然后用一个 Daemon 线程, 每隔一段时间扫描一下集合, 看看是不是有 “虫子” 该死,该死的 虫子 从集合里去掉。当然,为安全起见, 所有 与 虫子的 “接洽” 都有应该由这个集合来牵线。 abstract class Worm{ private int power; private final Collection nest; protected Worm(int power,Collection nest){ if( power <= 0) throw new IllegalArgumentException(" Why i'm about to die just after boring ? "); this.power = power;
try{ nest.add(this); }catch(UnsupportedOperationException e){ // maybe not modifiable collection. throw new IllegalArgumentException (" Please give a house ."); } } public void move(){ if( power ==0 ) throw new IllegalStateException(" I'm dead , let me sleep. "); power --; System.out.println(" moved ."); if( power == 0 ) nest.remove(this); }
int getPower(){return power;} public boolean isAlive(){ return power > 0; } }class WormNest{ private final HashSet worms = new HashSet(); public Worm createWorm(int power){ Worm w = new Worm(power,this){ }; } public Set getWorms(){ return worms; }}
哦, 这里创建方法还要改下:不能用 HashSet , 应该用 HashMap 然后给每个虫子一个名字,如果你要找虫子就必须用 名字, WormNest 不应该返回一个 Worm 对象的句柄给你, 这样不安全,可能你保留句柄的时间过长, 导致 上面的 I'm dead 异常, 只能 wormNest.moveWorm('wormA') ; 这样让 wormNest 管理虫子.abstract class Worm{ private int power; private final String name; private final HashMap nest; protected Worm(int power,HashMap nest){ if( power <= 0) throw new IllegalArgumentException(" Why i'm about to die just after boring ? "); this.power = power;
if( nest.containsKey(name) throw new IllegalArgumentException(" My brother has already this name, please give me another name ! "); try{ nest.put(name,this); }catch(UnsupportedOperationException e){ // maybe not modifiable collection. throw new IllegalArgumentException (" Please give a house ."); } } public void move(){ if( power ==0 ) throw new IllegalStateException(" I'm dead , let me sleep. "); power --; System.out.println(" moved ."); if( power == 0 ) nest.remove(this); }
int getPower(){return power;} public boolean isAlive(){ return power > 0; } }class WormNest{ private final HashSet worms = new HashSet(); public Worm createWorm(String name,int power){ Worm w = new Worm(name ,power,this){ }; } public void moveWorm(String name){ Worm w = worms.get(name); if( w == null) throw new IllegalArgumentException(name+" not found or already dead "); w.move(); } }
class worm(){ private int blood; public void die(){ ... }
public int getBlood(){ return blood; } public static void main(String[] args){ Worm w = new Worm(); if(w.getBlood() == 0){ w.die(); } } }
你可以直接删除,这样没有了对象的引用,它就会被回收
abstract class Worm{
private int power;
private final Collection nest; protected Worm(int power,Collection nest){
if( power <= 0)
throw new IllegalArgumentException(" Why i'm about to die just after boring ? "); this.power = power;
try{
nest.add(this);
}catch(UnsupportedOperationException e){ // maybe not modifiable collection.
throw new IllegalArgumentException (" Please give a house .");
} }
public void move(){
if( power ==0 )
throw new IllegalStateException(" I'm dead , let me sleep. ");
power --;
System.out.println(" moved ."); if( power == 0 )
nest.remove(this);
}
int getPower(){return power;} public boolean isAlive(){
return power > 0;
}
}class WormNest{
private final HashSet worms = new HashSet(); public Worm createWorm(int power){
Worm w = new Worm(power,this){ };
} public Set getWorms(){ return worms; }}
只能 wormNest.moveWorm('wormA') ; 这样让 wormNest 管理虫子.abstract class Worm{
private int power;
private final String name;
private final HashMap nest; protected Worm(int power,HashMap nest){
if( power <= 0)
throw new IllegalArgumentException(" Why i'm about to die just after boring ? "); this.power = power;
if( nest.containsKey(name)
throw new IllegalArgumentException(" My brother has already this name, please give me another name ! ");
try{
nest.put(name,this);
}catch(UnsupportedOperationException e){ // maybe not modifiable collection.
throw new IllegalArgumentException (" Please give a house .");
} }
public void move(){
if( power ==0 )
throw new IllegalStateException(" I'm dead , let me sleep. ");
power --;
System.out.println(" moved ."); if( power == 0 )
nest.remove(this);
}
int getPower(){return power;} public boolean isAlive(){
return power > 0;
}
}class WormNest{
private final HashSet worms = new HashSet(); public Worm createWorm(String name,int power){
Worm w = new Worm(name ,power,this){ };
}
public void moveWorm(String name){
Worm w = worms.get(name);
if( w == null) throw new IllegalArgumentException(name+" not found or already dead "); w.move();
}
}
private int blood; public void die(){
...
}
public int getBlood(){
return blood;
} public static void main(String[] args){
Worm w = new Worm();
if(w.getBlood() == 0){
w.die();
}
}
}
...
}
里面可做一些资源释放的动作。 if(w.getBlood() == 0){
w.die();
w = null;//这里赋null应是可以的。
}
当一个对象不在被引用时,它符合garbage collection。通常,通过变量引用一个对象,当变量离开作用域的时候,便被撤消,也就不再引用这个对象。或者,你能通过设置引用对象的变量值为特殊的空值(NULL)而停止引用一个对象。一个程序能多次引用同一个对象。 无用单元收集方法 Java运行环境有一个无用单元收集方法以定期释放那些不再被引用的对象。无用单元收集方法自动完成,虽然,有些情况你可能通过调用System类的gc方法运行这个方法。例如,你可以想在产生大量的无用单元代码后或者需要许多存储代码区前运行无用单元收集方法。 Finalization 在一个对象获得无用单元收集前,无用单元收集程序给对象一个调用它自己的finalize方法的机会。这一个方法即是 finalization。 大多数程序员不必编写finalize方法。但有时候,一个程序员必须实现finalize方法释放资源,例如native peers,就不在无用单元收集程序的控制下。 这个finalize方法是Object类成员,Object类是Java平台的顶层类,是所有类的超类。一个类能忽略finalize 方法执行任何类型对象所必须的finalization(调用它自己的finalize方法)。如果你忽略finalize(不在程序代码中出现)和finalization,当执行完JAVA程序时将自动调用super.finalize方法释放对象资源。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()