我想创建一个应用程序,能够检测到其他的自身实例并阻止它们运行。为了做到这一点,我考虑开启一个新的
假设我有以下代码:
ServerSocket
,在某个特定于应用程序的端口上,并依靠如果我尝试绑定同一端口超过一次时会抛出的异常来“检测”和关闭重复的应用程序实例。我知道我可以像写入当前工作目录中的文件并“检测”它那样完成相同行为,但我真的不想这样做(如果应用程序崩溃并且无法删除该文件会发生什么?),所以我选择了ServerSocket
路线。假设我有以下代码:
public class MyClass{
public static void main(String[] args) throws IOException{
new ServerSocket(1234);
new Thread(){
//This is a non-daemon thread. Assume its run() method never returns.
}.start();
}
}
问题
除了创建ServerSocket
之外,我的应用程序从未真正需要再次使用它,因为其存在仅允许我检测另一个实例的启动。 因此,保存对该ServerSocket
的引用将导致编译警告(未使用的引用)。 我是个整洁狂人,所以如果可以避免,我宁愿不保存引用。 我的问题是,在所有非守护线程退出之前,是否会在垃圾回收之前回收此ServerSocket
实例(假设应用程序不会失败或以其他方式退出),如果是,那么它关联的端口会因此变得未绑定吗?