`
darkma
  • 浏览: 520980 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

java 判断程序是否正在运行

阅读更多

 

public class ProcessBuilder {

 

/**

* 进程运行标记文件名称

*/

public final String SIGN_RUN_FILE_NAME = "run.do";

 

private static Logger log = Logger.getLogger(ProcessBuilder.class);

 

/**

* 创建进程

* @param cmd

*            命令行

* @param workDir

*            指定的工作目录

* @throws IOException

*/

public Process create(String[] cmd, File dir) throws Exception {

// 执行命令行,创建新的进程

Process ps = Runtime.getRuntime().exec(cmd, null, dir);

if (ps != null) {

//  (非常重要)输出进程流中的信息,防止运行过程中因为进程流的阻塞,导致被迫挂起

                        new ProcessStreamUtil(ps.getErrorStream(), "ERROR").start();

new ProcessStreamUtil(ps.getInputStream(), "OUTPUT").start();

return ps;

}

return null;

}

 

/**

* 标记进程的运行 (注:在运行主目录下创建一个目标文件,并加上文件锁, 用于当外部程通过文件锁来判断程序是否正在运行)

* @return

*/

public boolean signRunning() throws Exception {

// 运行目录

String lockPath = System.getProperty("user.dir");

File dir = new File(lockPath);

if (!dir.exists()) {

dir.mkdirs();

}

// 待锁定的目标文件路径

lockPath = lockPath + File.separator + SIGN_RUN_FILE_NAME;

log.debug("标记文件:" + lockPath);

 

return this.tryLockFile(lockPath);

}

 

/**

* 通过文件锁来判断程序是否正在运行

* @return 如果正在运行返回true,否则返回false

*/

public boolean isRunning(String lockFilePath) throws Exception {

log.debug("嗅探文件:" + lockFilePath);

int i = 0;

// 延时60秒,嗅探目标文件是否已被锁上

do {

if (i++ > 20) {

return false;

}

 

if (!this.tryLockFile(lockFilePath)) {

return true;

} else {

Thread.sleep(3 * 1000L);

}

} while (true);

}

 

/**

* 尝试对目标文件进行加锁操作

* @param lockFilePath

*            目标文件

* @return

*/

private boolean tryLockFile(String lockFilePath) throws Exception {

// 待锁定的目标文件路径

log.debug(lockFilePath);

 

RandomAccessFile fis = null;

FileLock flock = null;

FileChannel lockfc = null;

try {

fis = new RandomAccessFile(lockFilePath, "rw");

lockfc = fis.getChannel();

// 尝试加锁

flock = lockfc.tryLock();

if (flock != null) {

return true;

}

} finally {

// 释放资源

if (fis != null)

fis.close();

if (flock != null)

lockfc.close();

}

 

return false;

}

 

}

 

 

// 进程流输出工具类

 

public class ProcessStreamUtil extends Thread {

private Logger log = Logger.getLogger(ProcessStreamUtil.class);

private InputStream is = null;

private String type = null;

 

public ProcessStreamUtil(InputStream is, String type) {

this.is = is;

this.type = type;

}

 

public void run() {

log.debug(type + "......");

InputStreamReader isr = null;

BufferedReader br = null;

try {

isr = new InputStreamReader(is);

br = new BufferedReader(isr);

String line = null;

while ((line = br.readLine()) != null) {

log.debug(type + ">" + line);

}

} catch (Exception ioe) {

log.error(ioe);

} finally {

try {

if (isr != null)

isr.close();

if (br != null)

br.close();

} catch (Exception er) {

log.error(er);

}

}

}

}

分享到:
评论

相关推荐

    java 获取程序运行环境的信息

    java 获取程序运行环境的信息 java 获取程序运行环境的信息 java 获取程序运行环境的信息

    Java U盘检测小程序

    Java U盘检测小程序,原理很简单,使用线程实现,写着好玩的。

    用java编写有关判断是否为三角形

    利用java编写的小程序判断三边是否能构成三角形,由各个方面的的事例构成。

    编写一个判断回文数java应用程序。

    用户从键盘输入一个1-9999之间的数,程序将判断这个数是几位数,并判断这个数是否回文数。回文数是指将数含有的数字逆序排列后得到的数和原数相同,例如12121,4224,6778776等都是回文数。 里面的word包含有详细的...

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了

    Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了,很好用,分享给大家

    java 判断是否为质数

    判断是否为质数,最优化的运行效率,减少性能损耗。测试计算机的运算速度。java学习的入门基础,最优化计算时间

    java生成exe文件直接运行!!!!!

    这是一个关于java中编号的游戏代码生成.exe直接运行; 试一试,看看你到底掌握了多少...............

    编写一个java应用程序

    (1)编写一个java应用程序,用户从键盘输入一个整数,判断这个数是几位数; (2)附加题:判断这个数是否是回文数。 说明:本题用到一个新的知识点:Java中如何进行数据输入,有两种方式:用图形化的界面进行数据...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    java判断学生成绩等级(可运行).rar

    定义一个学生的Java成绩为76,编写一个程序输出这个学生成绩是“中”级。(优:>=90;良:>=80;中:>=70;及格:>=60;不及格:) 注:有注释,可以运行

    根据包名检测APP运行状态 开机自动检测

    开机自动根据包名检测APP运行状态 ,使app一直运行在前台,我们用一个后台服务来监测这个app的运行情况。如果这个app被人为退出了,或者遇到bug崩溃了,就要重新启动,免得丢失数据。

    java集合知识-map、set等

    Set:元素不可以重复,是无序。p508 Set接口中的方法和Collection一致。 |--HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合的元素唯一性呢...以上程序不会报错,运行结果如下: (是由于没有使用泛型...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第...

    java编写的: 编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。

    3、 编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。 要求:1)以命令行格式运行:ip_test subnet/mask ip_addr 其中ip_test为程序名;subnet为子网号;mask是一个数值,代表子网掩码连续...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java开源包4

    在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java实现BASE64编码和解码程序

    实现BASE64编码和解码程序, 在类中实现如下函数并运行测试正确。 BASE64编码算法请在网上查询。 public String encode(byte[] data) { } public byte[] decode(String b) { }

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

Global site tag (gtag.js) - Google Analytics