2013-02-23 27 views
0

如何在Java中爲整個計算機創建真正的單身人士?整臺電腦的真正單身?

我有一個用Java編寫的控制檯應用程序。如果應用程序第二次執行,我希望它知道主應用程序已經在運行(並正在執行作業)。第二次執行只允許用戶查詢數據(作業)。我知道我可以創建一個文件並將所有內容寫入它,但是之後我將不得不支持計算機重置等。

有沒有更好的方法來做到這一點?

總結:

  • 我啓動應用程序。它具有工作並在間隔時間內執行它們。
  • 我第二次啓動應用程序。我收到消息,說明作業已經運行,我可以從第一個應用程序查詢數據。
  • 第三次啓動應用程序,它的工作原理與第二次相同。
  • 如果我停止第一個實例並開始一個新實例,它就像第一個實例一樣工作。

P.S.我知道這個問題肯定已經被問過多次,但谷歌和StackOverflow搜索只給我鏈接相對於Singleton設計模式。

+0

你可以使用套接字通信或類似[terracotta](http://terracotta.org/) – 2013-02-23 15:53:44

+1

來做到這一點單身人士並不是單個JVM的好主意;我認爲它們對於機器上的所有JVM都更糟糕。 – duffymo 2013-02-23 15:53:45

+6

讓您的第一個應用程序作爲服務器連接到套接字。其他人將無法綁定到該端口作爲服務器,直到第一個死亡。作爲獎勵,其他人可以作爲客戶端進行綁定,並使用該套接字在它們之間進行通信。 – 2013-02-23 15:53:48

回答

2

Here是一個可以做你想做的事情的鏈接。

這提供了結合在啓動一個插座,然後如果事情是在啓動時勢必然後將其發送的消息

你可以使用這個你的流程之間communitcate的代碼的例子。

+0

該示例明確指定了一個套接字端口。如果其他應用程序使用相同的端口,這可能會很麻煩。另一種方法是動態分配端口,將端口記錄在合適的位置(文件,數據庫,註冊表等),連接到端口並確認身份。 – 2013-02-23 16:18:19

2

作爲@PaulTomblin在評論中提到,您應該可以將服務器套接字綁定到特定端口。這有兩個目的。如果端口當前未綁定,則正在運行的進程成爲主實例。如果端口已經綁定,則正在運行的進程將成爲客戶端,而是連接到端口以便與主實例進行通信。