Java: Câu hỏi và bài tập phần Concurrency - Thread
Giải phóng thời gian, khai phóng năng lực
Câu hỏi:
- Bạn có thể truyền một đối tượng Thread tới Executor.execute không? Nếu có thì lời gọi đó như thế nào?
Bài tập:
Bài tập 1:
Biên dịch và chạy tập tin sau:
public class BadThreads {
static String message;
private static class CorrectorThread
extends Thread {
public void run() {
try {
sleep(1000);
} catch (InterruptedException e) {}
// Key statement 1:
message = "Mares do eat oats.";
}
}
public static void main(String args[])
throws InterruptedException {
(new CorrectorThread()).start();
message = "Mares do not eat oats.";
Thread.sleep(2000);
// Key statement 2:
System.out.println(message);
}
}
Đoạn mã trên sẽ in ra "Mares do eat oats". Liệu đoạn mã trên sẽ luôn in ra như vậy không? Nếu không thì vì sao? Nó có giúp thay đổi các tham số của hai lời gọi tới phương thức sleep()
? Bạn có đảm bảo rằng tất cả các thay đổi tới bởi biến message
sẽ xuất hiện trong luồng chính?
Bài tập2:
Thay đổi ví dụ producer-consumer trong Guarded Blocks bằng cách sử dụng lớp thư viện chuẩn thay vì sử dụng lớp Drop
.
Bài tập 3:
Tạo một lớp có tên MyThread với hàm tạo là: MyThread(String name, int sleep). Khi tạo một thể hiện của lớp này thì sau khi luồng (thread) được bắt đầu, nó sẽ in ra name sau mỗi sleep giây. Viết một ứng dụng bằng Java sử dụng lớp MyThread để tạo hai thread, thread đầu tiên có tên "ABC" và sleep là 3.5 giây; thread thứ hai có tên "DEF" và sleep là 2.5 giây. Khi chạy ứng dụng, thì nó sẽ in ra màn hình "ABC" sau 3.5 giây và sau đó in ra màn hình "DEF" sau 2.5 giây.
Bài tập 4:
Viết chương trình gồm 2 Thread:
- Thread 1: Cứ mỗi 2 giây sinh ra 1 số có 4 chữ số
- Thread 2: Kiểm tra xem năm tương ứng với số tạo ra ở Thread 1 xem năm đó có phải là năm nhuận hay không?
Bài tập 5:
Tạo một map kiểu Map<String, String> với phần key chứa thứ theo tiếng Anh, phần value chứa thứ theo tiếng Việt.
Ví dụ:
Monday | Thứ 2 |
Tuesday | Thứ 3 |
Wednesday | Thứ 4 |
Thursday | Thứ 5 |
Friday | Thứ 6 |
Saturday | Thứ 7 |
Sunday | Chủ nhật |
Tạo hai thread thực hiện các công việc sau:
- Thread thứ nhất: cứ sau mỗi một giây sẽ lấy một ngày ngẫu nhiên trong tuần bằng tiếng Anh (lấy từ map) rồi hiển thị ra màn hình.
- Thread thứ hai: dựa trên ngày lấy được của thread thứ nhất rồi dựa vào map để hiển thị ra màn hình ngày bằng tiếng Việt.
Viết phương thức main() để thực thi các phương thức trên.
Lưu ý: Cần đồng bộ hóa các thread để đảm bảo thứ tự thực hiện đúng.
Giải phóng thời gian, khai phóng năng lực