一個程序可以在內存裡面存在多個運行實例
比如
你可以打開多個微軟的Word程序
但是
有些時候我們需要控制程序運行的實例只有一個
也就是說
該程序同一時刻在內存裡面運行的只有一個實例
這樣當這個程序在內存中已經存在一個運行實例而用戶又再次運行了該程序的時候
有兩種結果
第一種結果是結束目前的運行實例
打開新運行的實例
第二種就是讓新運行的實例退出
原有的運行實例繼續運行
原理 因為任何時候只有一個實例
所以在實現這種功能的時候必須借助只能被獨享的資源
如果我們的程序是基於某個平台的
那麼就可以借助操作系統的內核對象來完成
比如Windows操作系統就提供了CreateMutex這個API來創建一個獨享的內核對象
但是因為要考慮平台無關
Java程序的實例控制不應該使用系統的內核對象來完成
那麼我們就必須找到其它的
可以獨享的資源
實際上
一台機器無論是在什麼操作系統上
網絡端口都是獨享的
也就是說基於網絡端口這個獨享的原理
我們可以很方便地讓我們的Java程序實現在內存裡面只有一個運行實例這個功能
而且這個功能的實現是與平台無關的
實現 我們先來看看第一種情況是如何實現的
也就是說如果系統中已經存在運行實例的話
那麼結束原有的運行實例
讓新實例運行
這個實現實例控制的Java類也是一個線程
具體的實現如下
import
*;
public class InstanceControl extends Thread {
public void run() {
try{
Socket sock = new Socket(
);
//創建socket
連接
端口
}
catch (Exception e)
{}
try{
ServerSocket server = new ServerSocket(
);//創建socket
在
端口監聽
server
accept(); //等待連接
server
close(); //有連接到來
也就是說有新的實例
System
exit(
); //這個實例退出
}catch (Exception e)
{
e
printStackTrace();
}
}
}
下面這個Java程序的程序入口是沒有實例控制功能的
public class ProgramMain {
public static void main(String argv[])
{
mainFrame frame = new mainFrame();
}
}
現在想加入實例控制
只需要添加兩行代碼
添加後代碼如下所示
public class ProgramMain {
public static void main(String argv[])
{
InstanceControl ic = new InstanceControl();
ic
start();
mainFrame frame = new mainFrame();
}
}
在這個基礎上
要實現第二種情況
也就是已經有實例運行的情況下
新的實例退出
保持原有的運行實例
就只需要一點小的改動了
具體的實現如下
import
*;
public class InstanceControl
extends Thread {
public void run() {
try{
Socket sock = new Socket(
);//創建socket
連接
端口
System
exit(
); //連接成功
說明有實例存在
則退出
}catch (Exception e)
{}
try{
ServerSocket server = new ServerSocket(
);//創建socket
連接
端口
while (true)
{
server
accept(); //接受連接請求
}
}catch (Exception e)
{
e
printStackTrace();
}
}
}
這個類的使用方法和第一種情況的那個類是一樣的
只需要在原有的代碼上加入兩行代碼即可
InstanceControl
ic = new InstanceControl();
ic
start();
擴展 上面的程序也許有一個小bug
就是如果程序在開始運行時ServerSocket監聽的端口已經被其它程序占用
那麼程序的運行就會受到影響
所以程序的端口應該盡量取得大一些
在這種情況下其它程序占用這個程序使用的端口的概率是可以忽略不計的
同時
還可以做兩種擴展
第一種是把端口寫在配置文件中
可通過讀配置文件得到端口
這樣就能夠在其它程序占用目前端口的情況下改變這個程序使用的端口
還有一種是在運行的時候用兩個InstanceControl類分別在兩個端口監聽
只要有一個InstanceControl類得到連接就做出響應
這樣兩個端口都被其它程序占用的概率就更加的微乎其微了
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25374.html