cuốn sách gpt4 ai đã làm

Sử dụng Platform.exit() và System.exit(int) cùng nhau

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 03:36:41 30 4
mua khóa gpt4 Nike

Tôi muốn đóng ứng dụng javafx bằng mã trả về được chỉ định. Duyệt qua các câu trả lời trên SO, tôi tìm thấy thành ngữ sau:

Platform.exit();
System.exit(0);

Ví dụ ở đây: Dừng chủ đề trước khi đóng chương trình JavaFX của tôi
hoặc ở đây:Ứng dụng JavaFX vẫn chạy sau khi đóng

Hai phương thức này lần lượt được thực thi và có vẻ như chúng ta đang cố gắng sao chép một số Hành động. Tôi giả sử rằng nếu Nền tảng.exit() thành công, nó sẽ không quay lại cuộc gọi Hệ thống.exit(0) địa điểm. Tuy nhiên, nếu Nền tảng.exit() Chỉ cần kích hoạt một số thao tác tắt máy đang chạy trên một luồng khác, trả về và có thể được gọi Hệ thống.exit(0) Chà, điều này có thể dẫn đến một số điều kiện chạy đua với hai luồng cố gắng tắt cùng một ứng dụng.

Vậy chính xác thì thành ngữ này hoạt động như thế nào?

câu trả lời hay nhất

gọi System.exit(...) Chấm dứt máy ảo Java.

据我所知,调用 Nền tảng.exit() Điều đó chỉ có nghĩa là Bộ công cụ JavaFX đã bị đóng, khiến cho phiên bản ứng dụng ngừng hoạt động. dừng lại() Phương thức này được gọi trên luồng ứng dụng FX và được phép chấm dứt luồng ứng dụng FX. Điều này lần lượt dẫn đến Ứng dụng.launch() trở lại. Nếu bạn đang ở chủ yếu(...) Thành ngữ được sử dụng trong các phương pháp:

public static void main(String[] args) {
Application.launch(args);
}

rồi một lần phóng() trở lại,chủ yếu() Phương thức này không còn gì để thực hiện và (miễn là không có luồng không phải daemon nào đang chạy), ứng dụng sẽ thoát theo cách thông thường. Nền tảng.exit() Trong mọi trường hợp, một cặp sẽ không được tạo ra System.exit(...) call: Nhưng trong một số trường hợp, nó sẽ cho phép JVM thoát ra đơn giản vì nó không có gì để làm.

Nếu bạn gọi System.exit(...), về cơ bản JVM sẽ thoát ngay lập tức. Vì vậy, ví dụ, nếu bạn Ứng dụng.launch() sau đó chủ yếu(...) Nếu có mã trong phương thức, mã sẽ được gọi Sau đó thực thi Platform.exit(), nhưng không gọi System.exit(...) sau đó. Tương tự như vậy, nếu bạn ghi đè Ứng dụng.stop(), sau đó gọi Nền tảng.exit() gọi sau dừng lại() phương pháp, nhưng không gọi System.exit(...) 之后。

Nếu bạn có các chủ đề không phải daemon đang chạy,Nền tảng.exit() sẽ không buộc họ phải đóng cửa, nhưng System.exit() cuộc họp.

Ví dụ sau đây sẽ chứng minh điều này:

nhập javafx.application.Application;
nhập javafx.application.Platform;
nhập javafx.scene.Scene;
nhập javafx.scene.control.Button;
nhập javafx.scene.layout.HBox;
nhập javafx.stage.Stage;

lớp công khai ExitTest mở rộng Ứng dụng {

@Ghi đè
dừng trống công khai () {
System.out.println("Dừng gọi");
}

@Ghi đè
public void start(Giai đoạn chínhStage) {
Nút startThread = Nút mới ("Bắt đầu chuỗi không phải daemon");
startThread.setOnAction(e -> new Thread(() -> {
System.out.println("Chuỗi bắt đầu");
thử {
Khóa đối tượng = đối tượng mới();
đã đồng bộ hóa (khóa) {
lock.wait();
}
} bắt (InterruptedException ex) {
System.err.println("Bị gián đoạn");
Thread.currentThread().interrupt();
} finally {
System.out.println("Hoàn thành chủ đề");
}
}).bắt đầu());

Nút thoát = Nút mới ("Thoát đơn giản");
exit.setOnAction(e -> {
System.out.println("Gọi Platform.exit()");
Platform.exit();
});

Nút ForceExit = Nút mới ("Buộc thoát");
ForceExit.setOnAction(e -> {
System.out.println("Gọi Platform.exit():");
Platform.exit();
System.out.println("Gọi System.exit(0):");
System.exit(0);
});

Cảnh cảnh = Cảnh mới (HBox mới (5, startThread, exit, ForceExit));
PrimaryStage.setScene(cảnh);
PrimaryStage.show();
}

public static void main(String[] args) {
khởi chạy(args);
System.out.println("launch() hoàn thành");
}
}

Thông thường bạn nên gọi Nền tảng.exit() Thoát khỏi ứng dụng JavaFX để có thể tắt nó một cách nhẹ nhàng: Ví dụ: nếu bạn cần bất kỳ mã "dọn dẹp" nào, bạn có thể đặt nó vào dừng lại() Trong phương pháp này,Nền tảng.exit() sẽ cho phép nó thực thi. Nếu bạn đang chạy các luồng nền cần phải chấm dứt, hãy tạo chúng thành các luồng daemon hoặc thực thi chúng thông qua dịch vụ thực thi và chạy chúng từ dừng lại() Phương pháp tắt dịch vụ thực thi. Dưới đây là một sửa đổi của ví dụ trên bằng cách sử dụng kỹ thuật này.

nhập java.util.concurrent.ExecutorService;
nhập java.util.concurrent.Executors;
nhập java.util.concurrent.TimeUnit;

nhập javafx.application.Application;
nhập javafx.application.Platform;
nhập javafx.scene.Scene;
nhập javafx.scene.control.Button;
nhập javafx.scene.layout.HBox;
nhập javafx.stage.Stage;

lớp công khai ExitTest mở rộng Ứng dụng {

riêng tư cuối cùng ExecutorService exec = Executors.newCachedThreadPool();

@Ghi đè
public void stop() ném Ngoại lệ bị gián đoạn {
System.out.println("Dừng gọi: cố gắng để các luồng nền hoàn thành...");
exec.shutdown();
if (exec.awaitTermination(2, TimeUnit.SECONDS)) {
System.out.println("Đã thoát chủ đề nền");
} khác {
System.out.println("Chuỗi nền không thoát, cố gắng buộc chấm dứt (thông qua gián đoạn)");
exec.shutdownNow();
}
}

@Ghi đè
public void start(Giai đoạn chínhStage) {
Nút startThread = Nút mới ("Bắt đầu chuỗi không phải daemon");
startThread.setOnAction(e -> {
exec.submit( () -> {
System.out.println("Chuỗi bắt đầu");
thử {
// chỉ chặn vô thời hạn:
Khóa đối tượng = đối tượng mới();
đã đồng bộ hóa (khóa) {
lock.wait();
}
} bắt (InterruptedException ex) {
System.out.println("Bị gián đoạn");
Thread.currentThread().interrupt();
} finally {
System.out.println("Hoàn thành chủ đề");
}
});
});

Nút thoát = Nút mới ("Thoát đơn giản");
exit.setOnAction(e -> {
System.out.println("Gọi Platform.exit()");
Platform.exit();
});


Cảnh cảnh = Cảnh mới (HBox mới (5, startThread, exit));
PrimaryStage.setScene(cảnh);
PrimaryStage.show();
}

public static void main(String[] args) {
khởi chạy(args);
System.out.println("launch() hoàn thành");
}
}

Nếu bạn muốn sử dụng Nền tảng.exit() để thực hiện tắt máy một cách duyên dáng và bạn muốn System.exit(...) Trả về giá trị >, các phương thức sau sẽ hoạt động. Lưu ý rằng điều này không thực sự được khuyến khích: trong mã sản xuất, bạn không thực sự nên dựa vào nền tảng hỗ trợ mã thoát quy trình.

Lớp công khai Ứng dụng mở rộng Ứng dụng {

riêng tư mã thoát int tĩnh = 0;

lối ra tĩnh công khai(int exitCode) {
App.exitCode = exitCode;
Platform.exit();
}

@Ghi đè
public void start(Giai đoạn chínhStage) {
// ...

someThing.addEventHander(someEventType, e -> App.exit(42));

// ...
}

@Ghi đè
dừng trống công khai () {
// mã dọn dẹp...
}

public static void main(String[] args) {
Application.launch(args);
System.exit(exitCode);
}
}

Về java - sử dụng Platform.exit() và System.exit(int) cùng nhau, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/46053974/

30 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress