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 U盘检测小程序,原理很简单,使用线程实现,写着好玩的。
利用java编写的小程序判断三边是否能构成三角形,由各个方面的的事例构成。
用户从键盘输入一个1-9999之间的数,程序将判断这个数是几位数,并判断这个数是否回文数。回文数是指将数含有的数字逆序排列后得到的数和原数相同,例如12121,4224,6778776等都是回文数。 里面的word包含有详细的...
Quartz如何实现判断某个任务是否正在运行,在项目中用到的,已经测试过了,很好用,分享给大家
判断是否为质数,最优化的运行效率,减少性能损耗。测试计算机的运算速度。java学习的入门基础,最优化计算时间
这是一个关于java中编号的游戏代码生成.exe直接运行; 试一试,看看你到底掌握了多少...............
(1)编写一个java应用程序,用户从键盘输入一个整数,判断这个数是几位数; (2)附加题:判断这个数是否是回文数。 说明:本题用到一个新的知识点:Java中如何进行数据输入,有两种方式:用图形化的界面进行数据...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
定义一个学生的Java成绩为76,编写一个程序输出这个学生成绩是“中”级。(优:>=90;良:>=80;中:>=70;及格:>=60;不及格:) 注:有注释,可以运行
开机自动根据包名检测APP运行状态 ,使app一直运行在前台,我们用一个后台服务来监测这个app的运行情况。如果这个app被人为退出了,或者遇到bug崩溃了,就要重新启动,免得丢失数据。
Set:元素不可以重复,是无序。p508 Set接口中的方法和Collection一致。 |--HashSet: 内部数据结构是哈希表 ,是不同步的。 如何保证该集合的元素唯一性呢...以上程序不会报错,运行结果如下: (是由于没有使用泛型...
Java高级程序设计 第3章 Java反射机制 3.1 应用场景 3.2 相关知识3.3 实施过程 3.4 拓展知识3.5 拓展训练 3.6 课后小结3.7 课后习题 3.8 上机实训 Java高级程序设计实战教程第三章-Java反射机制全文共15页,当前为第...
3、 编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。 要求:1)以命令行格式运行:ip_test subnet/mask ip_addr 其中ip_test为程序名;subnet为子网号;mask是一个数值,代表子网掩码连续...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程...
ps -ef |grep java|grep
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
实现BASE64编码和解码程序, 在类中实现如下函数并运行测试正确。 BASE64编码算法请在网上查询。 public String encode(byte[] data) { } public byte[] decode(String b) { }
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...