Contoh dalam artikel ini menjelaskan solusi pemblokiran program eksternal yang dipanggil oleh Java berdasarkan Runtime, yang merupakan teknik yang sangat praktis. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
Terkadang beberapa program eksternal dipanggil dalam kode java, seperti SwfTools untuk mengonversi swf, ffmpeg untuk mengonversi video, dll. Jika kode Anda ditulis seperti ini: Runtime.getRuntime().exec(command), Anda akan menemukan bahwa program langsung dijalankan, tetapi memerlukan waktu agak lama untuk dijalankan di baris perintah karena Java tidak menunggu eksekusi program. program eksternal selesai. Anda perlu menggunakan pemblokiran untuk menunggu hasil eksekusi program eksternal:
InputStream stderr = proses.getInputStream();InputStreamReader isr = new InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null;sementara ((line = br.readLine()) != null ) System.out.println(line);int exitValue = proses.waitFor();
Untuk program eksternal umum bisa menggunakan kode pemblokiran di atas. Setidaknya tidak ada masalah dengan pdf2swf.exe.
Namun kemudian saya menemukan bahwa untuk ffmpeg, kode di atas akan menyebabkan program macet, dan perlu menggunakan metode lain, merangkumnya menjadi sebuah metode, sebagai berikut:
@SuppressWarnings("static-access")public static int doWaitFor(Proses proses) { InputStream in = null; InputStream err = null; int exitValue = -1; (); err = proses.getErrorStream(); boolean selesai = false; // Setel ke true ketika p selesai sementara (!selesai) { coba { sementara (in.available() > 0) { // Cetak keluaran dari panggilan sistem kita Character c = new Character((char) in.read()); System.out.print(c); () > 0) { // Cetak keluaran dari panggilan sistem kita Character c = new Character((char) err.read()); System.out.print(c); Jika proses // belum selesai, sebuah IllegalThreadStateException // dilempar. Jika sudah selesai, kita gagal dan // variabel selesai disetel ke true. exitValue = process.exitValue(); belum selesai; // Tidur sebentar untuk menghemat siklus CPU Thread.currentThread().sleep(500); e.printStackTrace(); } akhirnya { coba { jika (dalam != null) { in.close(); } } tangkap (IOException e) { e.printStackTrace() } jika (err != null) { coba { err.close(); } catch (IOException e) { e.printStackTrace();Saya harap penjelasan artikel ini dapat bermanfaat bagi pembelajaran pemrograman Java semua orang.