Không chạy được đồng hồ bằng thread

Xin chào mọi người. Em có lập trình chạy một đồng hồ số bằng ngôn ngữ java và có dùng Thread để chạy. Hiện tại thì đồng hồ đã chạy nhưng em không biết làm như nào để đồng hộ chạy chứ phải là nhảy số liên tục. Em cảm ơn.

import java.util.*;
import java.lang.Thread;
import java.util.Calendar;
public class Clock implements Runnable {
    int delay = 1000;
    public Clock(){}
    public void run() {
        while (true) {
            Calendar date = Calendar.getInstance();
            date.setTimeZone(TimeZone.getTimeZone("Etc/GMT-7"));
            System.out.print(date.get(Calendar.HOUR_OF_DAY) 
            + ":" + date.get(Calendar.MINUTE) 
            + ":" + date.get(Calendar.SECOND)); 
            System.out.println();
            try{
                Thread.sleep(delay);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}


public class Bai8 extends Clock {
    public static void main(String[] args){
         Clock clock = new Clock();
         Thread clockThread = new Thread(clock);
         clockThread.start();
    }
}

Ý bạn là nó thay số ngay 1 vị trí chứ không in ra từng dòng?

Java đa nền, mỗi nền tảng lại có cách xóa màn hình hoặc di chuyển con trỏ nhập/xuất khác nhau. Và phần nhập/xuất của Java cũng không toàn đồng bộ với nhập/xuất trên Console của nền tảng.

Bạn nên tạo ứng dụng bằng giao diện (Java Swing, JavaFx) thay vì Console cho tiện.

5 Likes

đúng ý em rồi đó bác là chỉ để nó thay đổi ngay trên dòng ý thôi. Ồ thì ra là vậy, Thảm nào em tìm mãi không ra cách để nó thay đổi trên từng dòng trong console. Em cảm ơn bác nhiều nhé.

Nói ngắn gọn là bỏ ý định đó đi bạn ơi, như bạn trên đã nói, làm bằng giao diện cho đời thanh thản.
Cách đây 4 năm mình đã tìm nát internet mà vẫn không giải quyết nổi :sweat_smile:

4 Likes

Em nghe bác trên nói vậy thì em cũng từ bỏ luôn rồi bác, cố quá thành quá cố thì chết dở :rofl::rofl:

Thực ra là làm được chỉ cần trước khi in ra thì in ký tự backpace ra là được ("\b"). Nhưng chạy bằng IDE thì IDE nó không hiểu ký tự này đâu. Build javac và run terminal thì ok
Bài em sưa lại thế này

public class Clock implements Runnable {
	int delay = 1000;

	public Clock() {
	}

	public void run() {
		int charsWritten = 0;
		while (true) {
			Calendar date = Calendar.getInstance();
			date.setTimeZone(TimeZone.getTimeZone("Etc/GMT-7"));
			String datePrn = date.get(Calendar.HOUR_OF_DAY) + ":" + date.get(Calendar.MINUTE) + ":"
					+ date.get(Calendar.SECOND);
			
			// remove previous result(print backpace)
			for (int i = 0; i < charsWritten; i++) {
				System.out.print("\b");
			}

			System.out.print(datePrn);
			charsWritten = datePrn.length();
			try {
				Thread.sleep(delay);
			} catch (Exception e) {
				System.out.println(e);
			}
		}
	}
}

Chạy như dưới


Em thử sẽ thấy kết quả.

6 Likes

Wow, em cảm ơn bác nhiều nhé. :kissing_heart::kissing_heart:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?