Java 我能告诉你我是否在范围之外吗?

Java 我能告诉你我是否在范围之外吗?,java,Java,有没有办法从物体内部判断我是否超出范围 我有一个必须关闭的对象。如果未关闭,则保证泄漏。如果可能的话,我想尝试自动关闭 我的私有实例变量之一是一个线程,它必须在关闭期间关闭。我猜线程的存在将导致未关闭的对象永远不会被gc Pauljava中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已 您需要了解finalize方法,然后可能还需要了解幻影引用 java中没有“超出范围”的概念,因为所有对象

有没有办法从物体内部判断我是否超出范围

我有一个必须关闭的对象。如果未关闭,则保证泄漏。如果可能的话,我想尝试自动关闭

我的私有实例变量之一是一个线程,它必须在关闭期间关闭。我猜线程的存在将导致未关闭的对象永远不会被gc


Paul

java中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已

您需要了解finalize方法,然后可能还需要了解幻影引用


java中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已

您需要了解finalize方法,然后可能还需要了解幻影引用


不,Java中没有这样的机制

但是,您可以将紧急清理放在停机挂钩中。有关详细信息,请参阅


请注意,这只能被视为最后的手段。

不,Java中没有这样的机制

但是,您可以将紧急清理放在停机挂钩中。有关详细信息,请参阅


请注意,这只能被视为最后的手段。

Java没有析构函数

如果对象需要在Java的自动内存垃圾收集之外进行显式清理,那么您可以提供显式方法,例如close()、terminate()或dispose()

如果您的线程通过持有对某个对象的引用来阻止该对象的垃圾收集,那么它可以改为持有不阻止垃圾收集的引用


对于弱引用,您可以判断引用的对象是否已被垃圾回收。但是,您无法判断它是否符合垃圾收集的条件

Java没有析构函数

如果对象需要在Java的自动内存垃圾收集之外进行显式清理,那么您可以提供显式方法,例如close()、terminate()或dispose()

如果您的线程通过持有对某个对象的引用来阻止该对象的垃圾收集,那么它可以改为持有不阻止垃圾收集的引用


对于弱引用,您可以判断引用的对象是否已被垃圾回收。但是,您无法判断它是否符合垃圾收集的条件
Something s = new Something();
try 
{
  // do things
} 
finally 
{ 
  s.close();
}

C#有一个关键字可以稍微整理一下
Something s = new Something();
try 
{
  // do things
} 
finally 
{ 
  s.close();
}

C#有一个关键字可以稍微整理一下

在研究这个问题时,我确实想出了一个近似的解决方案。本质上,在创建Runnable时,获取创建您的线程的副本,偶尔检查它的stacktrace。如果它变空了,你可以放心地认为它们已经完成了。。。或者你能吗

private void testThreads() throws InterruptedException {

  class ThreadTest implements Runnable {

    final Thread maker;

    private ThreadTest() {
      // Grab the maker's thread.
      maker = Thread.currentThread();
    }

    private boolean makerIsAlive() {
      // If maker's stack trace hits empty it is fair to assume they are done.
      return maker.getStackTrace().length != 0;
    }

    public void run() {
      // Keep checking the stack using a stacktrace.
      while (makerIsAlive()) {
        try {
          // Get out of here if maker has finished.
          // Wait one second.
          Thread.sleep(1000);
        } catch (InterruptedException ex) {
          break;
        }
      }
      System.out.println("====== Maker has finished! Exiting. ======");
    }
  }

  Thread thread = new Thread(new ThreadTest());
  thread.start();
  // Wait for 10 seconds.
  long finishTime = System.currentTimeMillis() + 10 * 1000;
  while (System.currentTimeMillis() < finishTime) {
    Thread.sleep(500);
  }
}
private void testThreads()引发InterruptedException{
类ThreadTest实现可运行{
终丝机;
私有线程测试(){
//抓住制造者的线。
maker=Thread.currentThread();
}
私有布尔makerIsAlive(){
//如果制造商的堆栈跟踪为空,则可以公平地假设它们已完成。
返回maker.getStackTrace().length!=0;
}
公开募捐{
//使用stacktrace不断检查堆栈。
while(makerIsAlive()){
试一试{
//如果maker完成了,就离开这里。
//等一下。
睡眠(1000);
}捕获(中断异常例外){
打破
}
}
System.out.println(“=======Maker已完成!正在退出”。=======”;
}
}
螺纹=新螺纹(新螺纹测试());
thread.start();
//等待10秒钟。
long finishTime=System.currentTimeMillis()+10*1000;
while(System.currentTimeMillis()
在研究这一点时,我确实提出了一个近似的解决方案。本质上,在创建Runnable时,获取创建您的线程的副本,偶尔检查它的stacktrace。如果它变空了,你可以放心地认为它们已经完成了。。。或者你能吗

private void testThreads() throws InterruptedException {

  class ThreadTest implements Runnable {

    final Thread maker;

    private ThreadTest() {
      // Grab the maker's thread.
      maker = Thread.currentThread();
    }

    private boolean makerIsAlive() {
      // If maker's stack trace hits empty it is fair to assume they are done.
      return maker.getStackTrace().length != 0;
    }

    public void run() {
      // Keep checking the stack using a stacktrace.
      while (makerIsAlive()) {
        try {
          // Get out of here if maker has finished.
          // Wait one second.
          Thread.sleep(1000);
        } catch (InterruptedException ex) {
          break;
        }
      }
      System.out.println("====== Maker has finished! Exiting. ======");
    }
  }

  Thread thread = new Thread(new ThreadTest());
  thread.start();
  // Wait for 10 seconds.
  long finishTime = System.currentTimeMillis() + 10 * 1000;
  while (System.currentTimeMillis() < finishTime) {
    Thread.sleep(500);
  }
}
private void testThreads()引发InterruptedException{
类ThreadTest实现可运行{
终丝机;
私有线程测试(){
//抓住制造者的线。
maker=Thread.currentThread();
}
私有布尔makerIsAlive(){
//如果制造商的堆栈跟踪为空,则可以公平地假设它们已完成。
返回maker.getStackTrace().length!=0;
}
公开募捐{
//使用stacktrace不断检查堆栈。
while(makerIsAlive()){
试一试{
//如果maker完成了,就离开这里。
//等一下。
睡眠(1000);
}捕获(中断异常例外){
打破
}
}
System.out.println(“=======Maker已完成!正在退出”。=======”;
}
}
螺纹=新螺纹(新螺纹测试());
thread.start();
//等待10秒钟。
long finishTime=System.currentTimeMillis()+10*1000;
while(System.currentTimeMillis()
什么是“自动关闭”?很难真正理解你想要实现什么。一个通用的解决方案是在不再需要对象时添加一个调用的清理方法