- 需求
- 一、将Java项目打包成jar
- 二、写.bat文件
- 1
我的Java程序(一个java文件、一些外部jar包、数据集)需要跑30个函数,常规做法就是写个for循环,遍历这30个函数,但是程序每跑一个函数就需要40min,这样的话,使用for循环跑完30个函数就得20h,此外也使得CPU的利用率不高(因为实验室的服务器装的是Window系统,可以充分压榨)。所以我就想,电脑上有16个核,自然可以并行运算,这样使得时间大大缩短,而且CPU利用率也提搞了。
- 2
首先想到的是多线程、多进程、GPU,但是经过实验多线程,发现使用多线程后还没我用for循环串行执行快,自己也分析了原因:(1)多线程是提高并发性,对运行时间长、复杂的程序意义不大(2)也可能程序编写的有问题(后续会深入学习多线程);对于多进程的话,网上只有Runtime的exec()⽅法、使⽤ProcessBuild方法两种,感觉这两个方法就是启动外部程序那种,可以利用dos命令作为参数,感觉不行。
- 3
自己看到IDEA软件可以同时运行多个Java程序,即多个控制台。它这种就是多进程,但是我总不能把我的程序(java文件复制30份,又因为同一路径下不能有相同的java文件名称,所以要放到30个不同的文件夹下或者30个名字不同的java文件),这样手动处理太麻烦了。
- 4
巧好jar包可以利用java -jar xxx.jar就可以运行自己的程序,而且这个命令后面可以跟参数,这些参数将被传到java文件中的mian方法中形参String[] arg,所以自己可以利用java -jar xxx.jar 函数序号,这条命令就可以指定运行某个函数了,所以我只有多输入几个上述命令,只要函数序号不同,就可以实现多个进程同时运行,而多个命令的运行,则可以使用bat文件(批处理文件)。
一、将Java项目打包成jar原因:因为java可以使用java -jar xxx.java命令,就可以运行这个程序,打包jar包时可以选择一个mainclass作为主类,使得运行上述命令时,就相当于运行的是那个自己选择的主类中的main函数。
步骤:将Java项目打包成.jar文件,可以参考这篇文章。
二、写.bat文件https://blog.csdn.net/weixin_43868148/article/details/124539092
1.新建start_all.bat文件,内容如下: @echo off cd %CD% start "start_all" javaw -jar HLO.jar 1 2 3 start "start_all" javaw -jar HLO.jar 4 5 start "start_all" javaw -jar HLO.jar 6 7 8 start "start_all" javaw -jar HLO.jar 9 10 start "start_all" javaw -jar HLO.jar 12 12 13 start "start_all" javaw -jar HLO.jar 14 15 start "start_all" javaw -jar HLO.jar 16 17 18 start "start_all" javaw -jar HLO.jar 19 20 start "start_all" javaw -jar HLO.jar 21 22 23 start "start_all" javaw -jar HLO.jar 24 25 start "start_all" javaw -jar HLO.jar 26 27 28 start "start_all" javaw -jar HLO.jar 29 30 Pause 2.双击start_all.bat文件即可运行
注意:
(1)每条命令必须要用start(只用javaw -jar HLO.jar 1 2 3不能同时执行多条,只能执行完一条在执行下一条)
(2)每条命令必须在start指令后加“start_all”(“start_all”指的是该bat文件名称)
(3)每条命令必须使用javaw指令,不能使用java指令(java指令不能后台执行,且必须开着DOS窗口,一旦DOS窗口关闭,程序就会终止)
(4)每条命令后跟的数组是该进程对应的程序执行的函数号(自己程序里面需要解析后面跟的函数号,解析如下)
public static void main(String[] args) {
int[] funcIndex = new int[args.length];
for (int i = 0; i < args.length; i++) {
funcIndex[i] = Integer.parseInt(args[i]);
}
QHLO_KX.fun = funcIndex;
}```



