带有Java API的linux范围的信号量

时间:2011-09-25 07:49:29

标签: java linux semaphore

我需要阻止某个应用程序功能与它自己同时运行。风险很大,因为此函数在提交给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(); 
                }
        }
}

3 个答案:

答案 0 :(得分:2)

开始操作时,可以在共享目录中创建一个0字节文件'methodname.LOCK',并在完成后删除它。使用Java中的no recreate标志创建它可以解决您的问题。

确保在“finally”块中删除它,这样您就不会处于文件存在的状态,并继续阻止运行

的过程

答案 1 :(得分:1)

只需在特定端口打开一个serversocket。如果成功则没有其他应用程序,如果没有抛出异常。

答案 2 :(得分:0)

我见过的唯一标准Java功能禁止同一程序的多个实例是Java WebStart中的SingleInstanceService

http://download.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/examples.html#SingleInstanceService

它要求您为您的应用程序创建一个JNLP文件,这有点麻烦,但无论如何可能对您非常有用。请注意,Java不允许将命令行参数传递给您的程序,这在这种情况下可能非常不方便。取决于您的命令行所说的内容。

如果Java WebStart不适合您,则必须向操作系统询问拒绝后续请求的资源并自动释放该资源。这些非平台特定的唯一一个是TCP / IP套接字,但这些很少见,可能被其他程序使用。在Linux下你可能会要求共享内存,但我没有亲身经验。