Hook线程
- Hook线程只有在收到退出信号的时候会被执行
- Hook线程通常用于执行资源释放的工作
- 不要在Hook线程中执行耗时长的工作
实例应用
使用Hook线程防止程序被重复启动
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class PreventDuplicated {
private final static String LOCK_PATH = "/home/wangyingao/locks";
private final static String LOCK_FILE = ".lock";
private final static String PERMISSIONS = "rw-------";
public static void main(String [] args) throws IOException {
//检查是否存在.lock文件
checkRunning();
//注入Hook线程,在程序退出时删除lock文件
Runtime.getRuntime().addShutdownHook(new Thread(()->{
System.out.println("The program received kill SIGNAL");
getLockFile().toFile().delete();
}));
//模拟程序运行
while(true) {
try {
TimeUnit.MICROSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static void checkRunning() throws IOException {
Path path = getLockFile();
if(path.toFile().exists())
throw new RuntimeException("The program has been running");
Set<PosixFilePermission> perms = PosixFilePermissions.fromString(PERMISSIONS);
Files.createFile(path, PosixFilePermissions.asFileAttribute(perms));
}
private static Path getLockFile() {
return Paths.get(LOCK_PATH,LOCK_FILE);
}
}