ตัวอย่างในบทความนี้อธิบายวิธีแก้ปัญหาการบล็อกโปรแกรมภายนอกที่เรียกโดย Java โดยยึดตาม Runtime ซึ่งเป็นเทคนิคที่ใช้งานได้จริง แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
บางครั้งโปรแกรมภายนอกบางโปรแกรมจะถูกเรียกใช้ในโค้ด Java เช่น SwfTools เพื่อแปลง swf, ffmpeg เพื่อแปลงวิดีโอ ฯลฯ หากโค้ดของคุณเขียนดังนี้: Runtime.getRuntime().exec(command) คุณจะพบว่าโปรแกรมถูกเรียกใช้งานทันที แต่จะใช้เวลาสักครู่เพื่อดำเนินการบนบรรทัดคำสั่ง เนื่องจาก Java ไม่รอการดำเนินการของ โปรแกรมภายนอกจึงจะเสร็จสมบูรณ์ คุณต้องใช้การบล็อกเพื่อรอผลการดำเนินการของโปรแกรมภายนอก:
InputStream stderr = process.getInputStream();InputStreamReader isr = ใหม่ InputStreamReader(stderr, "GBK");BufferedReader br = ใหม่ BufferedReader(isr);String line = null; While ((line = br.readLine()) != null ) System.out.println(line);int exitValue = process.waitFor();
สำหรับโปรแกรมภายนอกทั่วไป คุณสามารถใช้โค้ดบล็อกด้านบนได้ อย่างน้อยก็ไม่มีปัญหากับ pdf2swf.exe
แต่แล้วฉันก็ค้นพบว่าสำหรับ ffmpeg โค้ดด้านบนจะทำให้โปรแกรมค้าง และจำเป็นต้องใช้วิธีอื่น โดยสรุปเป็นวิธีการดังต่อไปนี้:
@SuppressWarnings("static-access")public static int doWaitFor(กระบวนการกระบวนการ) { InputStream in = null; InputStream err = null; int exitValue = -1; // ส่งคืนไปยังผู้โทรเมื่อ p เสร็จสิ้น ให้ลอง { in = process.getInputStream (); err = process.getErrorStream(); boolean เสร็จสิ้น = false; // ตั้งค่าเป็นจริงเมื่อ p เสร็จสิ้นในขณะที่ (!finished) { ลอง { while (in.available() > 0) { // พิมพ์ผลลัพธ์ของการเรียกระบบของเรา Character c = new Character((char) in.read()); System.out.print(c); } while (err.available () > 0) { // พิมพ์ผลลัพธ์ของการเรียกระบบของเรา Character c = new Character((char) err.read()); System.out.print(c); } // ถามกระบวนการสำหรับ exitValue หากกระบวนการ // ยังไม่เสร็จสิ้น IllegalThreadStateException // จะถูกโยนทิ้งไป หากเสร็จแล้ว เราจะผ่าน และ // ตัวแปรที่เสร็จสิ้นแล้วจะถูกตั้งค่าเป็น true เสร็จแล้ว // นอนสักหน่อยเพื่อประหยัดรอบ CPU Thread.currentThread().sleep(500); e.printStackTrace(); } ในที่สุด { try { if (in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } if (err != null) { try { err.close(); } catch (IOException e) { e.printStackTrace(); } } ส่งคืน exitValue;}ฉันหวังว่าสิ่งที่บทความนี้อธิบายจะเป็นประโยชน์ต่อการเรียนรู้การเขียนโปรแกรม Java ของทุกคน