`
darkma
  • 浏览: 521429 次
  • 性别: 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远程...

    linux的shell命令检测某个java程序是否执行

    ps -ef |grep java|grep

    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个目标文件 内容...

Global site tag (gtag.js) - Google Analytics