Java 我能告诉你我是否在范围之外吗?
有没有办法从物体内部判断我是否超出范围 我有一个必须关闭的对象。如果未关闭,则保证泄漏。如果可能的话,我想尝试自动关闭 我的私有实例变量之一是一个线程,它必须在关闭期间关闭。我猜线程的存在将导致未关闭的对象永远不会被gcJava 我能告诉你我是否在范围之外吗?,java,Java,有没有办法从物体内部判断我是否超出范围 我有一个必须关闭的对象。如果未关闭,则保证泄漏。如果可能的话,我想尝试自动关闭 我的私有实例变量之一是一个线程,它必须在关闭期间关闭。我猜线程的存在将导致未关闭的对象永远不会被gc Pauljava中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已 您需要了解finalize方法,然后可能还需要了解幻影引用 java中没有“超出范围”的概念,因为所有对象
Pauljava中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已 您需要了解finalize方法,然后可能还需要了解幻影引用
java中没有“超出范围”的概念,因为所有对象都在堆上。一旦你说“新”,唯一能帮你清理的就是gc。您可以使用try/finally,也可以使用终结器等,但仅此而已 您需要了解finalize方法,然后可能还需要了解幻影引用
不,Java中没有这样的机制 但是,您可以将紧急清理放在停机挂钩中。有关详细信息,请参阅
请注意,这只能被视为最后的手段。不,Java中没有这样的机制 但是,您可以将紧急清理放在停机挂钩中。有关详细信息,请参阅
请注意,这只能被视为最后的手段。Java没有析构函数 如果对象需要在Java的自动内存垃圾收集之外进行显式清理,那么您可以提供显式方法,例如close()、terminate()或dispose() 如果您的线程通过持有对某个对象的引用来阻止该对象的垃圾收集,那么它可以改为持有不阻止垃圾收集的引用
对于弱引用,您可以判断引用的对象是否已被垃圾回收。但是,您无法判断它是否符合垃圾收集的条件 Java没有析构函数 如果对象需要在Java的自动内存垃圾收集之外进行显式清理,那么您可以提供显式方法,例如close()、terminate()或dispose() 如果您的线程通过持有对某个对象的引用来阻止该对象的垃圾收集,那么它可以改为持有不阻止垃圾收集的引用
对于弱引用,您可以判断引用的对象是否已被垃圾回收。但是,您无法判断它是否符合垃圾收集的条件如果你的意思是类似于C++中的RAII是如何做的,答案是否定的——java坚持你知道你什么时候不再需要什么东西,如果你需要做些什么来清理它。通常的做法是:
Something s = new Something();
try
{
// do things
}
finally
{
s.close();
}
C#有一个关键字可以稍微整理一下如果你的意思是类似于C++中的RAII是如何做的,答案是否定的——java坚持你知道你什么时候不再需要什么东西,如果你需要做些什么来清理它。通常的做法是:
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()
什么是“自动关闭”?很难真正理解你想要实现什么。一个通用的解决方案是在不再需要对象时添加一个调用的清理方法