Lớp Runtime
(Class Runtime)
Lớp java.lang.Runtime cung cấp các phương thức để tương tác với môi trường chạy của ứng dụng Java. Mỗi ứng dụng Java có một thể hiện duy nhất của lớp Runtime, cho phép ứng dụng giao tiếp với môi trường thực thi.
Đặc điểm của lớp Runtime
↳ Mỗi ứng dụng Java có một thể hiện duy nhất của lớp Runtime: Lớp này cung cấp các phương thức để tương tác với môi trường nơi ứng dụng đang chạy. Thể hiện này có thể được truy cập thông qua phương thức getRuntime().
↳ Không thể tạo thể hiện mới của lớp Runtime: Ứng dụng không thể tạo ra một thể hiện mới của lớp Runtime; thay vào đó, nó phải sử dụng thể hiện duy nhất được cung cấp bởi JVM.
Khi nói về môi trường chạy Java (Java Runtime Environment - JRE), chúng ta đang đề cập đến tất cả các yếu tố cần thiết để chạy ứng dụng Java, bao gồm:
↳ Hệ điều hành: Java chạy trên nhiều hệ điều hành khác nhau như Windows, macOS, Linux, và các hệ điều hành khác. Hệ điều hành cung cấp nền tảng cơ bản mà Java và các ứng dụng Java chạy trên đó.
↳ Java Virtual Machine (JVM): JVM là phần của môi trường chạy Java, thực thi mã bytecode Java và chuyển đổi nó thành mã máy cụ thể cho hệ điều hành và phần cứng. JVM là nơi chạy các ứng dụng Java.
↳ Thư viện Java: Đây là các lớp và API được cung cấp bởi Java Standard Library, cung cấp các chức năng cơ bản như nhập/xuất, xử lý chuỗi, kết nối mạng, và nhiều tính năng khác.
↳ Tài nguyên hệ thống: Các tài nguyên như bộ nhớ, ổ đĩa, và các thiết bị đầu vào/đầu ra mà ứng dụng Java có thể tương tác thông qua các phương thức trong lớp Runtime và các API khác của Java.
Tương tác với môi trường chạy Java
Lớp Runtime trong Java cung cấp cách để tương tác trực tiếp với môi trường chạy, bao gồm:
↳ Quản lý bộ nhớ: Bạn có thể yêu cầu Garbage Collector chạy, kiểm tra lượng bộ nhớ đang sử dụng và lượng bộ nhớ còn trống.
↳ Thực thi lệnh hệ điều hành: Bạn có thể thực thi các lệnh hệ điều hành từ ứng dụng Java, như mở một chương trình hay thực hiện một lệnh shell.
↳ Quản lý quy trình: Bạn có thể quản lý các quy trình con và các chương trình khác đang chạy từ ứng dụng Java.
↳ Thêm và loại bỏ shutdown hooks: Bạn có thể chỉ định mã sẽ được thực hiện khi JVM tắt, điều này có thể hữu ích để thực hiện các công việc dọn dẹp hoặc lưu trữ trạng thái.
Các phương thức quan trọng của lớp Runtime trong Java
Lớp Runtime là một lớp tiện ích trong Java cung cấp các phương thức để tương tác với môi trường hệ thống. Dưới đây là một số phương thức quan trọng của lớp Runtime:
↳ public static Runtime getRuntime(): Trả về instance của lớp Runtime.
↳ public void exit(int status): Kết thúc máy ảo Java hiện tại với mã trạng thái đã cho.
↳ public void addShutdownHook(Thread hook): Đăng ký một luồng móc tắt máy để thực thi khi JVM tắt.
↳ public Process exec(String command): Thực thi lệnh đã cho trong một tiến trình riêng biệt.
↳ public int availableProcessors(): Trả về số lượng bộ xử lý có sẵn trong hệ thống.
↳ public long freeMemory(): Trả về lượng bộ nhớ trống trong JVM.
↳ public long totalMemory(): Trả về tổng lượng bộ nhớ trong JVM.
Ví dụ cho các phương thức quan trọng của lớp Runtime trong Java.
1. public static Runtime getRuntime()
Phương thức này trả về đối tượng Runtime hiện tại của JVM. Nó cho phép bạn truy cập các phương thức khác của lớp Runtime.
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
System.out.println("Runtime instance: " + runtime);
}
}
//kết quả: Runtime instance: java.lang.Runtime@372f7a8d
2. public void exit(int status)
Phương thức này kết thúc chương trình Java hiện tại với mã trạng thái đã cho. Mã trạng thái 0 thường biểu thị thành công, và các giá trị khác có thể biểu thị lỗi.
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
System.out.println("Chương trình sẽ thoát ngay bây giờ.");
Runtime.getRuntime().exit(0); // Kết thúc chương trình với mã trạng thái 0
System.out.println("Dòng này sẽ không được thực hiện.");
}
}
3. public Process exec(String command):
Phương thức exec(String command) của lớp Runtime trong Java có thể thực thi bất kỳ lệnh nào mà hệ điều hành hỗ trợ. Lệnh bạn có thể thực thi phụ thuộc vào hệ điều hành và môi trường cụ thể mà chương trình Java đang chạy. Dưới đây là một số ví dụ về các lệnh có thể sử dụng với exec trên các hệ điều hành khác nhau:
↳ Lệnh dir: Liệt kê các tệp và thư mục trong thư mục hiện tại trên window.
Ví dụ
rocess process = Runtime.getRuntime().exec("cmd /c dir")
↳ Lệnh ipconfig: Hiển thị thông tin cấu hình mạng trên window.
Ví dụ
Process process = Runtime.getRuntime().exec("ipconfig");")
↳ Lệnh notepad: Mở Notepad (trình soạn thảo văn bản) trên window.
Ví dụ
Process process = Runtime.getRuntime().exec("notepad");
↳ Lệnh ls: Liệt kê các tệp và thư mục trong thư mục hiện tại Trên Unix/Linux/MacOS.
Ví dụ
Process process = Runtime.getRuntime().exec("ls");
↳ Lệnh cat: Hiển thị nội dung của tệp Trên Unix/Linux/MacOS.
Ví dụ
Process process = Runtime.getRuntime().exec("cat myfile.txt");
4. public int availableProcessors()
Phương thức này trả về số lượng bộ xử lý khả dụng trong hệ thống.
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
int processors = runtime.availableProcessors();
System.out.println("Số lượng bộ xử lý có sẵn: " + processors);
}
}
5. public long freeMemory() và public long totalMemory()
Hai phương thức này trả về lượng bộ nhớ trống và tổng lượng bộ nhớ trong JVM tính bằng byte.
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
// Lấy đối tượng Runtime để truy cập các phương thức liên quan đến bộ nhớ
Runtime runtime = Runtime.getRuntime();
// In ra tổng lượng bộ nhớ mà JVM đã cấp phát
System.out.println("Tổng bộ nhớ (Byte): " + runtime.totalMemory());
// In ra lượng bộ nhớ trống ban đầu
System.out.println("Bộ nhớ trống (Ban đầu): " + runtime.freeMemory());
// Tạo một số đối tượng để làm giảm bộ nhớ trống
for (int i = 0; i < 10000; i++) {
new Example(); // Tạo các đối tượng mới của lớp MemoryTest
}
// In ra lượng bộ nhớ trống sau khi tạo các đối tượng
System.out.println("Bộ nhớ trống (Sau khi tạo 10000 phiên bản): " + runtime.freeMemory());
// Yêu cầu JVM thực hiện thu gom rác
System.gc();
// In ra lượng bộ nhớ trống sau khi gọi gc()
System.out.println("Bộ nhớ trống (Sau khi gọi gc()): " + runtime.freeMemory());
}
}
Kết quả của chương trình là
Bộ nhớ trống (Ban đầu): 132348928
Bộ nhớ trống (Sau khi tạo 10000 phiên bản): 132120576
Bộ nhớ trống (Sau khi gọi gc()): 7821064
Khi chạy chương trình này sẽ giúp bạn thấy sự thay đổi trong lượng bộ nhớ trống trước và sau khi tạo đối tượng cũng như sau khi gọi phương thức gc().