java中Runtime.getRuntime().exec是用来执行外部命令的,我就是用这个来执行spark程序spark-submit,我的场景就是定时任务调用这个代码来执行spark任务,但是总是遇到Runtime.getRuntime().exec一直等待不结束,导致程序不往下执行,定时任务的线程也一直卡着不动。
1.阻塞原因分析
用jps命令查看到了阻塞到的进程,再用jstack查看进程信息,截取了最后的信息,因为jstack是从后往前分析的。# jps
8023 SparkSubmit
#jstack 8023
"main" #1 prio=5 os_prio=0 tid=0x00007f66fc010000 nid=0x1f7f runnable [0x00007f6705ba6000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000005cbc49dc0> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked