我需要阻止某个应用程序功能与它自己同时运行。风险很大,因为此函数在提交给java.util.Timer的代码中(每隔几分钟重复几个小时),并且设置该函数的过程完成并返回到bash命令行。然后,用户可以调用相同的程序。另一个风险来自具有两个或更多控制台窗口的用户,并且他们错误地在两个控制台窗口中运行该程序。
我认为使用Java API的操作系统范围的信号量可能会起到作用。有这样的Java档案吗?
我被问到是否使用了多个JVM。我认为如果打开多个控制台,则会隐含多个JVM。
这是我使用Java的Timer和TimerTask的包装器。
public final class TimedExecutorWrapper
{ ... various private members ...
public Timer go()
{
Timer myTimer = new Timer();
myTimer.scheduleAtFixedRate(this.myTask,
this.startTodayAtThisTime,
this.frequencyInSeconds * 1000);
TimerTask myTaskToInvokeCancel = new TaskToInvokeCancel(myTimer);
// use the same Timer to schedule the task that cancels and purges
myTimer.schedule(myTaskToInvokeCancel,
this.stopTodayAtThisTime);
return myTimer;
}
private final class TaskToInvokeCancel extends TimerTask
{
private Timer timer; // to be cancelled and purged
TaskToInvokeCancel(Timer timer)
{
this.timer = timer;
}
public void run()
{
this.timer.cancel(); // discards any scheduled tasks without
// interfering with any running task
this.timer.purge();
}
}
}
答案 0 :(得分:2)
开始操作时,可以在共享目录中创建一个0字节文件'methodname.LOCK',并在完成后删除它。使用Java中的no recreate标志创建它可以解决您的问题。
确保在“finally”块中删除它,这样您就不会处于文件存在的状态,并继续阻止曾运行
的过程答案 1 :(得分:1)
只需在特定端口打开一个serversocket。如果成功则没有其他应用程序,如果没有抛出异常。
答案 2 :(得分:0)
我见过的唯一标准Java功能禁止同一程序的多个实例是Java WebStart中的SingleInstanceService
。
它要求您为您的应用程序创建一个JNLP文件,这有点麻烦,但无论如何可能对您非常有用。请注意,Java不允许将命令行参数传递给您的程序,这在这种情况下可能非常不方便。取决于您的命令行所说的内容。
如果Java WebStart不适合您,则必须向操作系统询问拒绝后续请求的资源并自动释放该资源。这些非平台特定的唯一一个是TCP / IP套接字,但这些很少见,可能被其他程序使用。在Linux下你可能会要求共享内存,但我没有亲身经验。