我想创建一个可以检测自身其他实例并阻止它们运行的应用程序。为了实现这一点,我正在考虑在某个特定于应用程序的端口上打开一个新ServerSocket
端口,然后依靠如果我尝试多次绑定到同一个端口来“检测”并杀死重复的应用程序时应该抛出的异常实例。我知道我可以做一些事情,比如将一个文件写入当前工作目录并“检测”它以完成同样的行为,但我真的不想这样做(如果应用程序死了会发生什么) t 删除文件?),这就是我选择这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
,我的应用程序永远不需要再次使用它,因为它的存在使我能够检测到我的应用程序的另一个实例何时尝试启动。因此,保存对 said 的引用ServerSocket
将导致编译警告(未使用的引用)。我是一个整洁的怪胎,所以如果可以避免的话,我宁愿不保存参考。我的问题是,这个ServerSocket
实例是否会在所有非守护线程退出之前被垃圾收集(假设应用程序没有失败或以其他方式退出),如果是这样,它的关联端口是否会因此变得未绑定?