Tôi cảm thấy đây có thể là một câu hỏi ngu ngốc, nhưng tôi không có nhiều kinh nghiệm với người nghe... Dù sao, tôi có một câu hỏi về chủ đề và người nghe, hãy xem xét mã này (có thể không đúng về mặt cú pháp, điều này vừa đến với tôi). ):
lớp công khai Nội dung {
riêng tư SimpleLongProperty time = new LongProperty(this, "time");
Người thực thi riêng tư thực thi;
Nội dung công cộng(Đồng hồ đồng hồ) {
time.bind(clock.getValue);
thực thi = Executors.newFixedThreadPool(5);
}
khoảng trống công khai someAction() {
for(int i = 0; i < 5; i++) {
execute.execute(scheduleTask());
}
}
lịch trình có thể chạy công khaiTask() {
time.addListener((obs, oldV, newV) -> {
// Mã ở đây
});
}
}
Khi gọi someAction() và gọi ScheduleTask() 5 lần để thêm 5 người nghe, mỗi người nghe có thực thi mã trong luồng riêng của mình khi thời gian được cập nhật không? Hay nó sẽ thực thi mã trong luồng chính vì đó là thời điểm?
Việc có thể viết mã và kiểm tra nó trên máy trạm đã tìm ra câu trả lời cho tôi.
lớp công khai Nội dung {
thời gian LongProperty riêng tư = SimpleLongProperty mới (cái này, "thời gian");
Người thực thi riêng tư thực thi;
Nội dung công cộng(Đồng hồ đồng hồ) {
time.bind(clock.getValue);
thực thi = Executors.newCachedThreadPool(runnable -> {
Chủ đề t = Chủ đề mới (có thể chạy được);
t.setDaemon(true);
trả lại t;
});
}
khoảng trống công khai someAction() {
for(int i = 0; i < 5; i++) {
execute.execute(scheduleTask(i));
}
}
public Runnable lịchTask(int i) {
time.addListener((obs, oldV, newV) -> {
System.out.println("Nhiệm vụ " + i + ": " + Thread.currentThread());
});
}
}
Đoạn mã trên sẽ in:
Nhiệm vụ 0: Chủ đề [Chủ đề ứng dụng JavaFX, 5, chính]
Nhiệm vụ 1: Chủ đề [Chủ đề ứng dụng JavaFX, 5, chính]
Nhiệm vụ 2: Chủ đề [Chủ đề ứng dụng JavaFX, 5, chính]
Nhiệm vụ 3: Chủ đề [Chủ đề ứng dụng JavaFX, 5, chính]
Nhiệm vụ 4: Chủ đề [Chủ đề ứng dụng JavaFX, 5, chính]
Thay đổi hàm someAction() và ScheduleTask() thành như thế này:
khoảng trống công khai someAction() {
for(int i = 0; i < 5; i++) {
lịchTask(i);
}
}
lịch trình voidTask(int i) {
Kiểm tra có thể chạy được = () -> {
System.out.println("Nhiệm vụ " + i + ": " + Thread.currentThread());
};
time.addListener((obs, oldV, newV) -> {
thực thi.execute(kiểm tra);
});
}
sẽ tạo ra kết quả sau:
Nhiệm vụ 0: Chủ đề [Chủ đề-16, 5, chính]
Nhiệm vụ 1: Chủ đề [Chủ đề-17, 5, chính]
Nhiệm vụ 2: Chủ đề [Chủ đề-20, 5, chính]
Nhiệm vụ 3: Chủ đề [Chủ đề-19, 5, chính]
Nhiệm vụ 4: Chủ đề [Chủ đề-18, 5, chính]
Tôi là một lập trình viên xuất sắc, rất giỏi!