Java調用python腳本,進程長時間卡住


啟動shell進程后,發現進程長時間運行無法結束,同時失去響應。這個問題的原因是shell腳本或者命令在運行的過程中會向標准輸出或者標准錯誤輸出寫出數據,但JVM又沒有去讀,導致緩沖區滿,進而導致進程阻塞。這個問題的解決的方法比較簡單,既然問題是緩沖區滿之后沒有及時清理,那么只要在Java代碼里去讀一下數據,保證緩沖區不會滿即可.

public static void executeCMD(final String cmdStrArr) {
		Runtime rt = Runtime.getRuntime();
		System.out.println("開始執行腳本");
		System.out.println("腳本內容為:" + cmdStrArr);

		try {
			Process p = rt.exec(cmdStrArr);
			// 防止緩沖區滿, 導致卡住
			new Thread() {
				@Override
				public void run() {
					super.run();
					String line;
					try {
						BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
						while ((line = stderr.readLine()) != null) {
							System.out.println("stderr:" + line);
						}
					}
					catch (Exception e) {

					}

				}
			}.start();


			new Thread() {
				@Override
				public void run() {
					super.run();
					String line;
					try {
						BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));
						while ((line = stdout.readLine()) != null) {
							System.out.println("stdout:" + line);
						}
					}
					catch (Exception e) {

					}
				}
			}.start();


			int exitVal = p.waitFor();
			if (0 != exitVal) {
				System.out.println("執行腳本失敗");
			}
			System.out.println("執行腳本成功");

		}
		catch (Exception e) {
			e.printStackTrace();
		}

	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM