Java ProcessHandle.onExit — รู้เมื่อโปรเซสลูกจบโดยไม่บล็อกเธรดหลัก
น้องกายEngineering
เวลาสตาร์ทโปรเซสลูกแล้วไม่อยาก waitFor() บนเธรดตัวจัดการคิว — ProcessHandle.onExit() คืน CompletableFuture<ProcessHandle> ที่ complete เมื่อโปรเซสจบ (API)
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
Process p = new ProcessBuilder("sleep", "1").start();
ProcessHandle done = p.toHandle()
.onExit()
.orTimeout(5, TimeUnit.SECONDS)
.join();
assert !done.isAlive() : "process should have exited";
System.out.println("onExit verified pid=" + done.pid());
}
}
ใช้คู่กับ ProcessHandle.Info เพื่ออ่าน command/start instant ถ้า OS สนับสนุน — บนบางแพลตฟอร์มการมองเห็นโปรเซสข้าม user ถูกจำกัด
Recap
- อ่าน ProcessHandle.onExit
- แทนที่ busy-wait ด้วย
onExit().thenAccept(...) - ใส่ timeout บน future ถ้าเป็นงานที่ต้องตอบผู้ใช้
- ทดสอบบน OS เป้าหมาย