Java - Cải tiến API Quá trình

Xin chào các pháp sư Java tương lai! ? Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị qua khu rừng ma thuật của các cải tiến trong API Quá trình của Java. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - chúng ta sẽ bắt đầu từ rất cơ bản và cùng nhau tiến hóa. Cuối cùng của bài hướng dẫn này, bạn sẽ có thể gọi các quá trình như một pháp sư mã hóa thực thụ! Vậy, cầm lấy pháp杖 (bàn phím) của bạn và hãy cùng lặn sâu vào!

Java - Process API Improvements

Giới thiệu về Quá trình Java

Trước khi chúng ta bắt đầu casting các phù thủy với API Quá trình của Java, hãy hiểu xem một quá trình thực sự là gì. Hãy tưởng tượng máy tính của bạn là một thành phố nhộn nhịp, và mỗi chương trình đang chạy trên nó giống như một cửa hàng nhỏ. Những cửa hàng này (quá trình) hoạt động độc lập, mỗi cửa hàng có không gian và tài nguyên riêng. Đúng là tuyệt vời phải không?

Bây giờ, API Quá trình của Java giống như một bộ công cụ ma thuật cho phép chúng ta tương tác với những cửa hàng này. Chúng ta có thể mở mới cửa hàng, nhòm vào các cửa hàng hiện có, và thậm chí đóng cửa chúng nếu cần. Đó giống như là thị trưởng của thành phố kỹ thuật số này!

Câu lệnh Điều khiển Java

Để sử dụng hiệu quả API Quá trình, chúng ta cần hiểu một số câu lệnh điều khiển cơ bản của Java. Những câu lệnh này giống như các tín hiệu giao thông trong thành phố của chúng ta, hướng dẫn luồng mã của chúng ta.

Câu lệnh If-Else

if (shopIsOpen) {
System.out.println("Chào mừng đến với cửa hàng của chúng tôi!");
} else {
System.out.println("Xin lỗi, chúng tôi đã đóng cửa.");
}

Trong ví dụ này, chúng ta đang kiểm tra xem cửa hàng có mở hay không. Nếu có, chúng ta chào mừng khách hàng. Nếu không, chúng ta lịch sự thông báo rằng cửa hàng đã đóng cửa.

Vòng lặp For

for (int i = 1; i <= 5; i++) {
System.out.println("Cửa hàng #" + i + " bây giờ đã mở!");
}

Ở đây, chúng ta đang mở 5 cửa hàng liên tiếp. Vòng lặp chạy 5 lần, mỗi lần in ra một thông báo về việc mở một cửa hàng mới.

Lập trình Hướng đối tượng

Java là một ngôn ngữ hướng đối tượng, có nghĩa là chúng ta tổ chức mã của mình vào các đối tượng. Hãy tưởng tượng các đối tượng như các cửa hàng cá nhân trong thành phố của chúng ta, mỗi cửa hàng có các thuộc tính và hành vi riêng.

public class Shop {
String name;
boolean isOpen;

public void open() {
isOpen = true;
System.out.println(name + " bây giờ đã mở!");
}
}

Trong ví dụ này, chúng ta đã tạo một lớp Shop. Mỗi cửa hàng có một tên và có thể mở hoặc đóng. Phương thức open() cho phép chúng ta mở cửa hàng.

Ví dụ Mở một Quá trình Mới

Bây giờ, hãy sử dụng những gì chúng ta đã học để mở một quá trình mới sử dụng API Quá trình của Java. Điều này giống như mở một cửa hàng mới trong thành phố của chúng ta!

import java.io.IOException;

public class ProcessSpawner {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("notepad.exe");
Process process = processBuilder.start();
System.out.println("Notepad đã được mở!");
} catch (IOException e) {
e.printStackTrace();
}
}
}

Trong ví dụ này, chúng ta đang sử dụng ProcessBuilder để tạo một quá trình mới mở Notepad. Dưới đây là những gì đang xảy ra:

  1. Chúng ta tạo một đối tượng ProcessBuilder, cho biết nó chạy "notepad.exe".
  2. Chúng ta sử dụng phương thức start() để thực sự khởi động quá trình.
  3. Nếu thành công, chúng ta in ra một thông báo rằng Notepad đã được mở.
  4. Nếu có lỗi (như Notepad không tìm thấy), chúng ta bắt IOException và in chi tiết lỗi.

Ví dụ Lấy Thông tin Quá trình Hiện tại

Bây giờ chúng ta đã mở một cửa hàng (quá trình), hãy xem cách chúng ta có thể lấy thông tin về quá trình hiện tại. Điều này giống như kiểm tra tình trạng cửa hàng của chính chúng ta!

public class CurrentProcessInfo {
public static void main(String[] args) {
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("ID Quá trình Hiện tại: " + currentProcess.pid());
System.out.println("Lệnh của Quá trình Hiện tại: " + currentProcess.info().command().orElse("N/A"));
System.out.println("Thời gian Bắt đầu của Quá trình Hiện tại: " +
currentProcess.info().startInstant().orElse(null));
}
}

Mã này thực hiện các thao tác sau:

  1. Chúng ta lấy quá trình hiện tại sử dụng ProcessHandle.current().
  2. Chúng ta in ID của quá trình sử dụng pid().
  3. Chúng ta in lệnh được sử dụng để khởi động quá trình (nếu có).
  4. Chúng ta in thời gian bắt đầu của quá trình (nếu có).

Ví dụ Lấy Thông tin Quá trình Con

Cuối cùng, hãy xem cách chúng ta có thể lấy thông tin về các quá trình con. Trong thành phố của chúng ta, điều này giống như kiểm tra tất cả các cửa hàng nhỏ mà cửa hàng chính của chúng ta đã mở.

import java.util.stream.Collectors;

public class ChildProcessesInfo {
public static void main(String[] args) {
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Quá trình Con:");
currentProcess.children().forEach(childProcess -> {
System.out.println("ID Quá trình Con: " + childProcess.pid());
System.out.println("Lệnh của Quá trình Con: " + childProcess.info().command().orElse("N/A"));
System.out.println("---");
});
}
}

Dưới đây là những gì mã này thực hiện:

  1. Chúng ta lấy quá trình hiện tại sử dụng ProcessHandle.current().
  2. Chúng ta sử dụng phương thức children() để lấy một luồng của các quá trình con.
  3. Chúng ta duyệt qua mỗi quá trình con, in ID và lệnh của nó.

Kết luận

Chúc mừng, các pháp sư Java trẻ! ? Bạn vừa mới bước những bước đầu tiên vào thế giới ma thuật của API Quá trình của Java. Chúng ta đã học cách mở mới các quá trình, lấy thông tin về quá trình hiện tại, và thậm chí là peek vào các quá trình con. Nhớ rằng, như bất kỳ phép thuật nào, thực hành làm nên hoàn hảo. Vậy hãy tiếp tục thử nghiệm, tiếp tục mã hóa, và sớm bạn sẽ trở thành một master thực sự của các quá trình Java!

Dưới đây là bảng tóm tắt các phương thức chính chúng ta đã sử dụng:

Phương thức Mô tả
ProcessBuilder.start() Khởi động một quá trình mới
ProcessHandle.current() Lấy quá trình hiện tại
ProcessHandle.pid() Lấy ID của quá trình
ProcessHandle.info().command() Lấy lệnh được sử dụng để khởi động quá trình
ProcessHandle.info().startInstant() Lấy thời gian bắt đầu của quá trình
ProcessHandle.children() Lấy các quá trình con

Tiếp tục thực hành, và sớm bạn sẽ có thể xử lý các quá trình như một chuyên gia! Đến gặp lại, chúc các bạn mã hóa vui vẻ! ?‍♂️?

Credits: Image by storyset