java开启多进程,执行.exe文件

1. .exe文件的生成

使用自己生成的应用程序,该应用程序带有参数。为了简便,以打印  输入的参数 为例,该应用程序的源码如下:

// myPrint.cpp
#include < iostream >
int main(int argc, char * argv[]){
char * it = argv[1];
if (it == nullptr){
std::cout << "This is nothing to be printed." << std::endl;
}else{
while (*it != ‘\0‘){
std::cout << *it++;
}
}
char ch;
std:: cin >> ch;  // system("pause");
return 0;
}

该函数经过编译连接后生成myPrint.exe应用程序。


2. java执行.exe, 为每个执行添加一个进程



*********************** 负责开启和关闭应用程序 ***********************

***维持一张String类,同开启的应用进程Process类的映射表

***1. 根据 序号 生成进程, 其他情况下也可以将String类转化为所需要的索引对象,只要与所运行的应用程序建立一一对应即可

***2. 根据  序号 , 查找当前的传输进程就可以关闭它

****2.1 关闭一个应用程序,由于只提供进程名,所以要先根据进程名获取pid,

****2.2 在根据pid KIll该应用

***3. 参考出处:

**** 3.1 2.1 和 2.2 参考 http://blog.sina.com.cn/s/blog_999cc24a0102vpjr.html

*****3.2 文中引入包的位置 https://java.net/projects/jna/downloads/directory/3.3.0

*****3.3 在3.1给出的地址下 下载两个jar包,在工程的src目录下新建lib文件夹,将jar文件放于里面,\src\lib

*********在eclispe选中当前工程,右键,build path--> config --> libraries 加入上面两个.jar即可

*****************************************   --icesongqiang




import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
class ProcManaSrc{
// 建立String与Proc的映射,根据数字做索引开关进程
private static Map m_String_Proc= new HashMap() ;
private ProcManaSrc(){};
public static void startProcess(String str){
//先查询是否已经运行
String m_index = str;
if(!m_String_Proc.containsKey(m_index)){ //不存在才创建
try {
// String cmd = "cmd /c start .\\myprint\\myprint.exe" +"\"" + str +"\"" ; 
String cmd = ".\\myprint\\myprint.exe" +"\"" + str +"\"" ; // 要加上引号
System.out.print(cmd);
System.out.println();
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd); 
m_String_Proc.put(str, proc);  
} catch (IOException e) {  
     e.printStackTrace();  
}
}
}
public static void closeProcess(String str){
String m_index = str;
if(m_String_Proc.containsKey(m_index)){ //存在才删除
killProcessTree(m_String_Proc.get(m_index));
m_String_Proc.remove(m_index);
}
}
private static void killProcessTree(Process process){
        try {
               Field f = process.getClass().getDeclaredField("handle");
               f.setAccessible(true);
               long handl = f.getLong(process);
               Kernel32 kernel = Kernel32.INSTANCE;
               WinNT.HANDLE handle = new WinNT.HANDLE();
               handle.setPointer(Pointer.createConstant(handl));
               int ret = kernel.GetProcessId(handle);
               Long PID = Long.valueOf(ret);
               String cmd = getKillProcessTreeCmd(PID);
               Runtime rt = Runtime.getRuntime();
               Process killPrcess = rt.exec(cmd); 
               killPrcess.waitFor();
               killPrcess.destroy();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
   }
 private static String getKillProcessTreeCmd(Long Pid){
       String result = "";
       if(Pid != null)
           result = "cmd.exe /c taskkill /PID "+Pid+" /F /T ";
       return result;
   }
   
}
public class ProcMana{
    ProcMana(){}
    public static void main(String agrv[]){
    System.out.println("Start.");
    String strs[] = {"hello", "world", "bye"};
    for(int i= 0 ; i< strs.length(); ++i){
        ProcManaSrc.startProcess(strs[i]);
    }
    try {
    Thread.sleep(1000*30);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    for(int i= 0 ; i< strs.length(); ++i){
        ProcManaSrc.closeProcess(strs[i]);
    }
    }
}

可以看到,该代码为strs三个元素执行了.exe应用程序,而且根据元素不同进行开关控制。

值得注意的是,

// String cmd = "cmd /c start .\\myprint\\myprint.exe" +"\"" + str +"\"" ;

没有装cmd插件的话 要使用cmd /c start 才能看到打印输出,但是在程序管理里可以看到进程muprint.exe运行, 但是使用cmd /c start后是关闭不了的,个人感觉是因为使用后再开java程序应该找不到dos里开的应用程序。

这一点笔者也不太懂。但是一般的,我们都是直接调用其他应用程序,dos窗口是不怎么需要的,所以对很多情况都用适应性。笔者这里举该打印的应用程序只是做示范,实际上也是另有他用。

时间: 2024-12-09 03:26:36

java开启多进程,执行.exe文件的相关文章

【实用工具】使用Java封装可执行exe应用全过程

目录 编写java代码 打包 创建exe文件 压缩 总结 本文将使用exe4j将java项目封装为可以发送给他人使用的工具为例,来记录将java项目封装为exe文件的全过程 编写java代码 目标:创建相关java项目代码,以实现相关功能 创建一个java项目,目录结构如下: 代码如下: CmdToolMain.java package com.gf.tool_cmd.main; import com.gf.tool_cmd.tool.CmdUtil; import com.gf.tool_cm

VS下面运行release版本可以正常运行而直接执行exe文件会出现问题

文如其名,最近做的两个不同的任务都遇到了这样一个问题,就是在VS下面运行release版本的程序可以正常运行而直接执行exe文件会出现问题,而且是偶有发生,在不同电脑发生的频率还不一样.一开始百思不得其解,以为是代码问题,后来百无聊奈怀疑VS运行release版本的程序时可能使用了兼容模式.于是右键exe文件打开文件属性,转到兼容性页面将"以兼容模式运行这个程序"选项勾上,确定之后再运行没有出现错误!之后测试了100次还是没有出现像之前一样的错误,因而确定了问题的原因.真是坑爹坑不完啊

将Java程序打包成可执行EXE文件的步骤

需要的工具myeclipse .jar2exe(附上下载地址,直接解压就可以用链接: https://pan.baidu.com/s/1qYPRgXu 密码: wbva) 1.将Java项目导出成.jar包 鼠标右键项目名,选择导出 导出的方式选择Runnable JAR file,点击next继续 选择导出文件的路径: jar文件成功导出到桌面 2.用工具将jar文件打包成EXE可执行文件 选择刚才导出的jar文件 选择要导出程序的类型: 选择主类,图片可不选 导出程序的具体设置: 选择辅助j

java项目打包成exe文件

前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: eclipse.exe4j(网上有软件和帐号下载) 第一步,将java项目打包成可执行jar文件,首先看一下我的java project结构,Main.java是程序入口类,里面有main函数,config目录是些配置文件,lib是用到的第三方类库 开始打包,Simulate(Java项目)-鼠标右键-E

python2.7 串口操作方式 编译 .py为windows可执行exe文件

一 python操作串口 首先下载安装串口模块pyserial . 代码实现: import serial ser = serial.Serial('/dev/ttyUSB2', 115200) print ser.portstr while True: str = ser.read(10) print str strInput = raw_input('enter some words:') n = t.write(strInput) 此处的/dev/ttyUSB2 是针对linux的串口设备

python文件封装成可执行exe文件

最近写了一个小小的程序,需要进行封装exe,下面就给大家介绍一下如何用pyinstaller去封装程序为exe程序. 首先,需要安装一下pip这个应用,这个已经在前面的文章中说过了,windows和linux都有请借鉴windows和linux. 第二步,安装好pip之后,在cmd命令窗口中输入pip install pyinstaller即能安装上pyinstaller,那么接下来要介绍一下关于pyinstaller几个指令了:-w指令直接发布的exe应用带命令行调试窗口,在指令内加入-w命令

java打包python到exe文件

最近想把写的python代码打包,以供没用安装python环境的同事使用,需求如下: 无python环境也可执行 文件尽量少,不要太乱 程序体积尽量小 如果需要更新的话重复类库不用更新 采用方案如下: 使用py2exe自动导入类库 使用7-ZIP压缩library upx压缩dll等文件 nsis生成安装文件 采用md5验证的方式判别不用更新的类库 使用py2exe自动导入类库 建立文件bin_setup.py Python代码   #!/usr/bin/env python # -*- cod

ASP.NET、C#调用外部可执行exe文件--多种方案

一. try { //方法一 //调用自己的exe传递参数 //Process proc = new Process(); //proc.StartInfo.FileName = @"D:\\hotelsoft\\zk.exe"; //proc.Start(); //Thread.Sleep(3000);//暂停3秒 //foreach (System.Diagnostics.Process pro in System.Diagnostics.Process.GetProcessesB

java project打包+生成.exe文件

一篇参考的帖子 http://tieba.baidu.com/p/2052248629 windows下Java应用程序的部署 http://blog.csdn.net/weiguolee/article/details/6868931