我用swing写了个程序
当这个程序运行并托盘时,再点击一次桌面开始启动这个程序
第一次已经运行表示创建了一个进程
但第二次点击运行表示又要创建一个新的进程,程序再次运行,两个程序不相干
我现在希望这样
假如第一次运行程序为托盘状态
第二次再点击时,去判断第一次的进程,得到程序运行的状态,让第一次运行的程序显示出来
如果不为托盘状态就保持原样
不再创建新的进程说了这么多
大家看看迅雷和快拨就明白了啊
来个高人指点哈啊
万分感激
当这个程序运行并托盘时,再点击一次桌面开始启动这个程序
第一次已经运行表示创建了一个进程
但第二次点击运行表示又要创建一个新的进程,程序再次运行,两个程序不相干
我现在希望这样
假如第一次运行程序为托盘状态
第二次再点击时,去判断第一次的进程,得到程序运行的状态,让第一次运行的程序显示出来
如果不为托盘状态就保持原样
不再创建新的进程说了这么多
大家看看迅雷和快拨就明白了啊
来个高人指点哈啊
万分感激
解决方案 »
- Struts2 标签遍历Map
- 学ejb有用吗??高手、大拿们指教
- spring简单问题
- org.xml.sax.SAXParseException: 缺少文件根组件
- JAVA 图片二进流转成PDF文件
- 有没有汉化的Tomcat文档,或中英文对照的Tomcat文档?
- Struts下内置对象 request 的问题
- JBuilder中编译EJB组件时候出错,在线求教。。。
- 关于java中查询数据库数据,数据量太大,拼接sql语句之后ie挂起怎么解决
- 求助 !!!【Idea Servlet开发】 artifacts中的web.xml servelet映射失败
- jstl 自定义tld标签报空指针错误!
- java怎样精确到小数点后20位?
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;public class SingleApplication {
// 在应用程序的main方法里调用此函数保证程序只有一个实例在运行.
public static void makeSingle(String singleId) {
RandomAccessFile raf = null;
FileChannel channel = null;
FileLock lock = null; try {
// 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建.
File sf = new File(System.getProperty("java.io.tmpdir") + singleId + ".single");
sf.deleteOnExit();
sf.createNewFile(); raf = new RandomAccessFile(sf, "rw");
channel = raf.getChannel();
lock = channel.tryLock(); if (lock == null) {
// 如果没有得到锁,则程序退出.
// 没有必要手动释放锁和关闭流,当程序退出时,他们会被关闭的.
throw new Error("An instance of the application is running.");
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
SingleApplication.makeSingle("single.test"); // 保证程序只有一个实例在运行. // 测试: 模拟一个程序正在运行5秒
System.out.println("Start");
System.out.println("Waiting 5 seconds."); for (int i = 0; i < 5; ++i) {
Thread.sleep(1000);
System.out.println((i + 1) + "......");
} System.out.println("End");
}
}
window 下 cmd /c Tasklist /v
unix linux ps -ef | grep 用户
如果有的话就让程序最大化..(这步我还没有想好)
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.util.RandomAccess;
import javax.swing.JOptionPane;public class A1 {private FileChannel channel;private FileLock lock;private File file;public A1(String lockFileName) {
file = new File(lockFileName);
}public boolean isAppActive() {
try {
channel = new RandomAccessFile(file, "rw").getChannel();
try {
lock = channel.tryLock(); } catch (OverlappingFileLockException e) {
closeLock();
return true;
}
if (lock == null) {
closeLock();
return true;
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
closeLock();
deleteFile();
}
});
return false;
} catch (Exception e) {
closeLock();
return true;
}
}protected void deleteFile() {
try {
file.delete();
} catch (Exception e) { }}private void closeLock() {
try {
lock.release();
} catch (Exception e) { } try {
channel.close();
} catch (Exception e) { }}public static void main(String[] args) {
A1 a = new A1(".lock");
if (a.isAppActive() == true)
JOptionPane.showMessageDialog(null, "已有一个程序在运行,程序退出"); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}}
第一次已经打开的进程要实时监视该端口或者文件,如果发生变化,读取出来 执行命令
Thread serverSocketThread = new Thread() {
public void run() {
// 开始监听一个端口,保证只有一个实例.
try {
ServerSocket serverSocket = new ServerSocket(INFORMATION_PORT);
while (started) {
Socket socket = serverSocket.accept(); // 接收客户连接 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
String line = null;
while ((line = reader.readLine()) != null) {
if(line =="某某命令"){
执行最大化操作
} if (STOP.equals(line)) {
started = false;
break;
}
} writer.close();
reader.close();
socket.close();
} serverSocket.close();
} catch (IOException e) { }
}
}; serverSocketThread.start();
* 向服务器发送命令行,给服务器端处理
*/
public static void clientSend(String[] lines) {
if (lines != null && lines.length <= 0) {
return;
}
try {
Socket socket = new Socket("localhost", SingleServerSork.INFORMATION_PORT); PrintWriter writer = new PrintWriter(socket.getOutputStream());
for (int i = 0; i < lines.length; i++) {
writer.println(lines[i]);
} writer.flush();
writer.close();
socket.close();
} catch (Exception e) {
FRContext.getLogger().error(e.getMessage(), e);
}
}