前几天在工作中,使用java程序多线程去调用shell脚本,shell脚本大概的逻辑是:
1,判断aa.exe时候存在,不存在则从某个路径下cp过来到当前目录下;
2,执行aa.exe;
3,执行完毕后删除当前目录下的aa.exe。
如果是单线程调用,这个脚本完全不存在任何问题。
后来根据需求,改成了多线程调用,测试时发现,时不时的会有一两个进程出现执行失败。报错信息是:aa.exe is busy。
一开始以为是java多线程的代码写的有问题,再三检查后发现并没有任何问题。
然后就开始分析多线程可能出现的情况,最后发现了问题所在。分析如下:
当两个进程同步进行时,因为原本目录下没有aa.exe,所以会同时复制exe到当前目录下,导致出现问题。
因此,我做了修改,把复制exe的功能放在java代码上,在多线程之前便复制过去,然后在全部线程走完后,再把exe程序删除。
shell脚本中不在控制exe的复制和删除。
就这样,问题完美解决了。