Tôi đã được thông báo rằng việc sử dụng Thread.Sleep()
là một giải pháp tồi vào những thời điểm mà người ta muốn thực hiện một khoảng thời gian nào đó trong một vòng lặp hành động theo phương thức được đồng bộ hóa. Mặt khác, tôi có hai luồng khác nhau đang hoạt động trong suốt thời gian chạy chương trình của tôi và cũng là một đối tượng được chia sẻ và khi tôi sử dụng Object.wait (long) trong đối tượng được chia sẻ đó, nó khiến GUI của tôi bị đóng băng trong một thời gian.Thread.Sleep thay thế trong Java
giải pháp nào tốt hơn cho vấn đề này?
Cập nhật phần này của mã là bao gồm một trong những chủ đề được bắt đầu từ năm GUI:
class temperatureUp extends Thread { @Override public void run() { while(true) { try { GBC.increaseTemp(); updateSystemStatus(); } catch(Exception ex) { StringWriter w = new StringWriter(); ex.printStackTrace(new PrintWriter(w)); txtLog.setText(w + "\n" + txtLog.getText()); } } } };
và đây là phương pháp đồng bộ trong đối tượng chia sẻ, GBC:
public synchronized void increaseTemp() throws InterruptedException{
// don't increase the temperature if the boiler
// is not turned on...
while (!isBoilerOn)
wait();
// increase the current temperature
if ((currentTemp + 1) < MAX_TEMP && currentTemp < desiredTemp) {
Thread.sleep(2000); ///what should put here if not thread sleep?
currentTemp ++;
updateGasBoilerStatus();
}
}
Bạn phải gây ra [Chủ đề gửi sự kiện] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html) để chờ. Bạn có thể cung cấp một ví dụ nhỏ trong mã làm thế nào bạn bắt đầu chủ đề của bạn và khi bạn gọi wait()? – theon
Hãy xem ['SwingWorker'] (http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html). Ngoài ra, xem ['this answer'] (http://stackoverflow.com/a/11546203/597657) để biết nó hoạt động như thế nào. –
@theon Tôi đã cập nhật bài đăng và thêm một số phần của mã. – Afflatus