- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
Tôi là một lập trình viên xuất sắc, rất giỏi!