我用swing开发了一个桌面应该用程序。
打包成jar文件。双击运行。
双击几次就可以出现多少个界面。
可是我想不管双击多少次,如果已经有一个进程在运行了,就不再启动新的进程了。
脑子里没货不知该怎么搞求教~我做过的:查API Runtime类 Process类及相关类 System类 都查了,没有查到好办法我想,如果能查询当前操作系统已开启的进程,从这里面发现是否开启了我这个程序的进程,如果开启则不做什么,如果没开启则启动一个新进程百度了,没百度出来,怎么查询当前操作系统已开启的进程。。是不是要用本地方法啊?本地方法这个东西,我从来没用过求教
打包成jar文件。双击运行。
双击几次就可以出现多少个界面。
可是我想不管双击多少次,如果已经有一个进程在运行了,就不再启动新的进程了。
脑子里没货不知该怎么搞求教~我做过的:查API Runtime类 Process类及相关类 System类 都查了,没有查到好办法我想,如果能查询当前操作系统已开启的进程,从这里面发现是否开启了我这个程序的进程,如果开启则不做什么,如果没开启则启动一个新进程百度了,没百度出来,怎么查询当前操作系统已开启的进程。。是不是要用本地方法啊?本地方法这个东西,我从来没用过求教
解决方案 »
- 在eclipse中postgreSQL的访问问题
- Graphics中 fillRect()与clipRect的区别
- 简单正则表达式问题,输出为什么会是false呢?
- Swing中Jtable中排序这么做,帮调试一下我的程序。
- 急!!用java监听串口,但不占用串口
- Package Java.applet.* can not find 新手求救
- 在Jbuilder7中TableDataSet中的数据在JdbTable中显示的精度问题。在线等候...
- jb7在win98下能安装成功吗?
- 小问题,100分,来者有分
- java 中的向量,vector能不能存放非string型的变量
- java 中的图形界面问题
- 大侠们,帮忙看一下小程序代码!!!!!!!!
要换个思路想,其实可以用很简单的方法实现。当启动应用时,在指定目录里生成一个空的file, 并且锁住这个file。再在程序中添加一个Check方法,当启动应用时Check这个file是否可写,如不可写说明当前已有这个应用启动,那么就不再运行。如果这个file不存在或可写时,说明这个应用当前没有运行,那么继续运行下去并锁住这个file。
还有很多方法,比如open一个socket也可以,想法和思路同上。
写程序的时候不要总是期盼着,你的需求都有一个现成的实现,可以自己实现嘛,JDK中没有就写不下去了吗,JDK中的API是给你组合使用的,写程序嘛要任意所至,挥洒自如。目的是要完成你的需求,到底有没有现成的实现这不重要。重要的是思路和想法,不是什么API,什么语言。没有什么唯一的标准答案,否则每个人写出来的程序都是一样的。
觉得锁文件的方法更好一些,因为使用Socket偶尔程序退出了,但是绑定的端口有可能没有释放,但是还是可行的。
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() {
RandomAccessFile raf = null;
FileChannel channel = null;
FileLock lock = null; try {
// 在临时文件夹创建一个临时文件,锁住这个文件用来保证应用程序只有一个实例被创建.
File sf = new File(System.getProperty("java.io.tmpdir") + "xxx.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(); // 保证程序只有一个实例在运行. // 测试: 模拟一个程序正在运行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");
}
}
// 这里换成singleId从参数传进来的,这样更好一些。
// 更好的是从系统的信息中取得当前应用程序的一些唯一信息,如PID,然后用来生成上锁的文件.
File sf = new File(System.getProperty("java.io.tmpdir") + singleId + ".single");
public native long getCurrentProcessId();
static {
System.loadLibrary("jni2");
}
}public class JNIJavaHowTo {
public static void main(String[] args) {
JavaHowTo jht = new JavaHowTo();
System.out.println("Press Any key...");
java.io.BufferedReader input =
new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try { input.readLine();}
catch (Exception e) { e.printStackTrace();}
System.out.println(jht.getCurrentProcessId());
}
}// jni2.cpp : Defines the entry point for the DLL application.
//#include "stdafx.h"
#include
#include "JavaHowTo.h" BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
JNIEXPORT jlong JNICALL Java_JavaHowTo_getCurrentProcessId
(JNIEnv *, jobject) { // return GetCurrentProcessId();
return getpid();
}
这是java中获取pid的方式大体能看懂,但是让我自己写,写不出来,本地方法的使用,还是可以看懂的BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}但是这句真看不懂