[Thực hành] Racing Cars

Threading

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

  1. Khởi tạo vận tốc ngẫu nhiên
  2. Tính khoảng cách đã đi được = khoảng cách hiện tại + vận tốc ngẫu nhiên
  3. 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 &amp;&amp; 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


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *