NỘI DUNG BÀI VIẾT
Mục tiêu
Luyện tập sử dụng Thread.
Mô tả
Viết một ứng dụng cho phép mô phỏng một cuộc đua xe.
Ứng dụng hiển thị một số chiếc xe, với các tốc độ di chuyển ngẫu nhiên. Hiển thị tổng thời gian của từng chiếc xe sau khi hoàn thành cuộc đua.
Hướng dẫn
Bước 1: Tạo lớp Car implements abstract interface Runnable
– Khai báo thuộc tính name(Tên của xe đua)
– Ghi đè method run của abstract interface Runnable
Bước 2: Trong method run thực hiện xử lý sau.
①Khởi tạo điểm start(hay km ban đầu)
②Khởi tạo time bắt đầu cuộc đua
③Thực hiện vòng lặp Kiểm tra chừng nào còn xe chưa kết thúc quãng đường đua thì xe vẫn tiếp tục chạy
- Khởi tạo vận tốc ngẫu nhiên
- Tính khoảng cách đã đi được = khoảng cách hiện tại + vận tốc ngẫu nhiên
- Bắt đầu vẽ quãng đường các xe chạy
Giải thích ý nghĩa các ký hiệu:
- Ký hiệu = đánh dấu quãng đường mà xe đã đi qua
- Ký hiệu o đánh dấu xe đang ở vị trí đó
- Ký hiệu – đánh dấu quãng đường còn lại về đích
- Ký hiệu | đánh dấu xuất phát và đích
public class Car implements Runnable { // Khai báo Tên của xe đua private String name; public Car(String name) { this.name = name; } @Override public void run() { // Khởi tạo điểm start(hay km ban đầu) int runDistance = 0; // Khởi tạo time bắt đầu cuộc đua long startTime = System.currentTimeMillis(); // Kiểm tra chừng nào còn xe chưa kết thúc quãng đường đua thì xe vẫn tiếp tục chạy while (runDistance < Main.DISTANCE) { try { // Random Speed KM/H int speed = (new Random()).nextInt(20); // Calculate traveled distance runDistance += speed; // Build result graphic String log = "|"; int percentTravel = (runDistance * 100) / DISTANCE; for (int i = 0; i < DISTANCE; i += STEP) { if (percentTravel >= i + STEP) { log += "="; } else if (percentTravel >= i && percentTravel < i + STEP) { log += "o"; } else { log += "-"; } } log += "|"; System.out.println("Car" + this.name + ": " + log + " " + Math.min(DISTANCE, runDistance) + "KM"); Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Car" + this.name + " broken..."); break; } } long endTime = System.currentTimeMillis(); System.out.println("Car" + this.name + " Finish in " + (endTime - startTime) / 1000 + "s"); } }
Bước 3: Tạo lớp Main
Khởi tạo biến DISTANCE = 100 là khoảng cách quãng đường đua
Khởi tạo biến STEP = 5 bước chạy mỗi xe trên đường đua
public static int DISTANCE = 100;
public static int STEP = 2;
Tạo phương thức main
public static void main(String[] args) { Car carA = new Car("A"); Car carB = new Car("B"); Car carC = new Car("C"); Thread thread1 = new Thread(carA); Thread thread2 = new Thread(carB); Thread thread3 = new Thread(carC); System.out.println("Distance: 100KM"); thread1.start(); thread2.start(); thread3.start(); }
Khởi tạo class Car phía trên truyền vào 3 xe đua là A, B, C.
Tiến hành tạo 3 Thread tương ứng với 3 xe đua là carA, carB, carC
Chạy 3 Thread tương ứng với việc 3 xe bắt đầu đua.
Chạy chương trình và kiểm tra kết quả
Distance: 100KM
CarB: |=o——————| 6KM
CarC: |===o—————-| 18KM
CarA: |==o—————–| 14KM
CarC: |=====o————–| 25KM
CarA: |=====o————–| 25KM
CarB: |====o—————| 23KM
CarC: |=====o————–| 29KM
CarA: |=====o————–| 29KM
CarB: |=====o————–| 26KM
CarA: |========o———–| 44KM
CarC: |======o————-| 34KM
CarB: |======o————-| 34KM
CarA: |==========o———| 53KM
CarC: |=========o———-| 49KM
CarB: |==========o———| 53KM
CarB: |===========o——–| 57KM
CarA: |==============o—–| 72KM
CarC: |===========o——–| 59KM
CarC: |============o——-| 60KM
CarA: |==============o—–| 72KM
CarB: |============o——-| 62KM
CarB: |==============o—–| 70KM
CarA: |==============o—–| 74KM
CarC: |=============o——| 69KM
CarA: |==================o-| 91KM
CarB: |================o—| 84KM
CarC: |===============o—-| 78KM
CarA: |====================| 100KM
CarB: |=================o–| 89KM
CarC: |================o—| 82KM
CarA Finish in 10s
CarB: |===================o| 95KM
CarC: |==================o-| 92KM
CarC: |===================o| 96KM
CarB: |===================o| 97KM
CarB: |====================| 100KM
CarC: |====================| 100KM
CarB Finish in 13s
CarC Finish in 13s
Kết quả cuối cùng:
Xe A về đích đầu tiên với tổng thời gian 10s
Xe B, Xe về đích cùng nhau với tổng thời gian 13s
★ Chú ý: bạn có thể thay đổi DISTANCE và STEP để xem các kết quả khác nhau