gcthread.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 106 行
JAVA
106 行
/*
* $Id: GCThread.java,v 1.3 2004/02/19 10:09:19 epr Exp $
*/
package org.jnode.vm.memmgr.def;
import org.jnode.system.BootLog;
import org.jnode.vm.Monitor;
/**
* @author Ewout Prangsma (epr@users.sourceforge.net)
*/
final class GCThread extends Thread {
/** The manager */
private final GCManager manager;
/** Monitor for synchronizing access to my fields */
private final Monitor heapMonitor;
/** Is a GC run requested? */
private boolean runNeeded;
/** Is the GC currently active */
private boolean gcActive;
/**
* Initialize this instance.
*
* @param manager
*/
public GCThread(GCManager manager, Monitor heapMonitor) {
super("gc-thread");
this.manager = manager;
this.heapMonitor = heapMonitor;
}
/**
* Trigger a GC run.
*
* @param waitToFinish
* If true, block until the run is ready, if false, return
* immediately.
*/
public final void trigger(boolean waitToFinish) {
if (runNeeded && !waitToFinish) {
return;
}
heapMonitor.enter();
try {
runNeeded = true;
heapMonitor.NotifyAll();
if (waitToFinish) {
while (runNeeded || gcActive) {
try {
heapMonitor.Wait(0L);
} catch (InterruptedException ex) {
// Ignore
}
}
}
} finally {
heapMonitor.exit();
}
}
/**
* Continue to GC.
*
* @see java.lang.Runnable#run()
*/
public final void run() {
while (true) {
try {
heapMonitor.enter();
try {
while (!runNeeded) {
heapMonitor.Wait(0L);
}
gcActive = true;
runNeeded = false;
} finally {
heapMonitor.exit();
}
// Now do the actual GC
manager.gc();
// Notify that we're ready
gcActive = false;
heapMonitor.enter();
try {
heapMonitor.NotifyAll();
} finally {
heapMonitor.exit();
}
} catch (Throwable ex) {
try {
BootLog.error("Error in GCThread", ex);
} catch (Throwable ex2) {
// Ignore
}
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?