40 câu hỏi phỏng vấn đa luồng hàng đầu và câu trả lời (2025)
Những câu hỏi phỏng vấn Java Multithreading hàng đầu
Dưới đây là những câu hỏi phỏng vấn đa luồng và câu trả lời dành cho cả ứng viên mới vào nghề và ứng viên có kinh nghiệm để có được công việc mơ ước của mình.
1) Thread là gì?
Luồng là một đơn vị thực thi đồng thời. Chúng ta có thể nói rằng nó là một phần của tiến trình có thể dễ dàng chạy đồng thời với các phần khác của tiến trình.
Tải xuống PDF miễn phí: Câu hỏi phỏng vấn đa luồng và câu trả lời
2) Đa luồng là gì?
Đa luồng trong Java là một quá trình thực thi hai hoặc nhiều luồng cùng lúc để tận dụng tối đa CPU.
Ưu điểm chính là:
- Chủ đề chia sẻ cùng một không gian địa chỉ
- Sợi chỉ vẫn nhẹ
- Chi phí giao tiếp giữa các luồng thấp.
3) Các trạng thái liên quan đến luồng là gì?
- Sẵn sàng
- Chạy
- Đợi
- Trạng thái chết
4) Thảo luận về vòng đời của một luồng?
Vòng đời của một luồng tương tự như vòng đời của các tiến trình đang chạy trong một hệ điều hành. Trong suốt vòng đời của nó, luồng có thể di chuyển từ trạng thái này sang trạng thái khác. Tuy nhiên, điều này phụ thuộc vào thao tác được thực hiện trên luồng.
5) Trạng thái của luồng là gì?
Sau đây là các trạng thái luồng khác nhau:
New: Một luồng vừa được khởi tạo ở trạng thái mới. Khi phương thức start() được gọi, luồng sẽ trở thành trạng thái sẵn sàng. Sau đó, nó được chuyển sang trạng thái có thể chạy bởi trình lập lịch luồng.
- Có thể chạy được: Một luồng đã sẵn sàng để chạy
- Chạy: Luồng đang thực thi sẽ ở trạng thái chạy.
- bị chặn: Một luồng bị chặn đang chờ khóa màn hình ở trạng thái này. Điều này cũng có thể xảy ra khi một luồng thực hiện thao tác I/O và chuyển sang trạng thái tiếp theo.
- Đang chờ đợi: Đây là một luồng đang chờ một luồng khác thực hiện hành động cụ thể.
- Thời gian chờ đợi: Đây là một luồng đang chờ một luồng khác thực hiện.
- Đã chấm dứt: Một luồng đã thoát sẽ ở trạng thái này.

6) Sự khác biệt chính giữa Thread và Process là gì?
Luồng là một tập hợp con của tiến trình. Tiến trình có thể chứa nhiều luồng. Tiến trình có thể chạy trên không gian bộ nhớ khác nhau, nhưng tất cả các luồng đều chia sẻ cùng một không gian bộ nhớ.
7) Bế tắc là gì?
Bế tắc là tình huống khi một luồng đang chờ khóa đối tượng, được luồng khác lấy được và luồng thứ hai cũng đang chờ khóa đối tượng được luồng đầu tiên lấy được. Vì cả hai luồng đang chờ nhau giải phóng nên tình trạng này được gọi là bế tắc.
8) LiveLock là gì?
Livelock xảy ra khi tất cả các luồng bị chặn và không thể thực thi do không có đủ tài nguyên cần thiết và không tồn tại bất kỳ luồng nào không bị chặn.
Livelock có thể xảy ra trong các điều kiện sau:
- Khi tất cả các luồng trong một chương trình được thực thi trên một đối tượng với tham số bằng không. Chương trình bị khóa trực tiếp và không bao giờ được xử lý cho đến khi một hoặc nhiều luồng gọi Object.notify() hoặc Object.notifyAll() trên các đối tượng có liên quan.
- Livelock cũng xảy ra khi tất cả các luồng trong chương trình bị kẹt trong vòng lặp vô hạn.

9) Màn hình là gì?
- Màn hình là một khối mã mà chỉ có thể được thực thi bởi một luồng tại một thời điểm.
- Nếu bất kỳ luồng nào khác cố gắng truy cập cùng lúc, luồng đó sẽ bị tạm dừng cho đến khi luồng hiện tại giải phóng Monitor.
10) Bạn muốn nói gì khi nói đến tình trạng thiếu luồng?
Trong trường hợp một luồng không có đủ CPU để thực thi thì hiện tượng đói luồng sẽ xảy ra.
Tuy nhiên, điều này có thể xảy ra trong các trường hợp sau
- Luồng có mức độ ưu tiên thấp sẽ nhận được ít CPU hơn so với luồng có mức độ ưu tiên cao. Luồng có mức độ ưu tiên thấp hơn có thể bị đói khi chờ đợi để có thêm không gian CPU để thực hiện tính toán.
- Luồng có thể chờ vô thời hạn để khóa trên màn hình của đối tượng nhưng notify() có thể liên tục đánh thức một số luồng khác. Trong trường hợp đó, luồng cũng sẽ chết đói.
11) Ý nghĩa của busy spin trong đa luồng là gì?
Busy spin là một kỹ thuật mà các lập trình viên đồng thời sử dụng để khiến một luồng chờ trong một điều kiện nhất định. Điều này khá khác so với các phương pháp truyền thống như wait() và sleep(), tất cả đều liên quan đến việc từ bỏ quyền kiểm soát CPU. Phương pháp này không yêu cầu từ bỏ CPU, thay vào đó, nó chỉ chạy vòng lặp rỗng.
12) Chuyển đổi ngữ cảnh trong đa luồng là gì?
Đây là quá trình lưu trữ và khôi phục trạng thái CPU. Điều này giúp tiếp tục thực hiện luồng từ cùng một điểm tại một thời điểm sau đó. Đây là một trong những tính năng thiết yếu cho hệ điều hành đa nhiệm và hỗ trợ cho môi trường đa luồng.
13) Tại sao hành vi của Thread lại không thể đoán trước?
Chúng ta có thể nói rằng hành vi của luồng là không thể đoán trước vì việc thực thi các luồng phụ thuộc vào bộ lập lịch luồng. Người ta nên nhớ rằng mỗi bộ lập lịch luồng có một triển khai khác nhau trên các nền tảng khác nhau như Windows, Unix, v.v.
14) Làm thế nào để tạm dừng việc thực thi một Luồng trong một khoảng thời gian nhất định?
Phương thức sleep() được sử dụng để tạm dừng việc thực thi luồng trong một khoảng thời gian nhất định. Tuy nhiên, điều này sẽ không dừng việc xử lý luồng trong một khoảng thời gian cụ thể. Tuy nhiên, khi luồng thức dậy từ chế độ ngủ, trạng thái của nó sẽ thay đổi thành có thể chạy và dựa trên lịch trình luồng, nó sẽ được thực thi.
15) Có bao nhiêu cách để một luồng có thể vào trạng thái chờ?
Một luồng có thể vào trạng thái chờ bằng những cách sau
- Sử dụng phương thức sleep()
- Chặn trên I/O
- Không thành công khi cố gắng lấy khóa của đối tượng
- Bằng cách gọi phương thức wait() của đối tượng
16) Điều gì xảy ra nếu chúng ta không ghi đè phương thức chạy?
Trong Java, khi chúng ta gọi phương thức start() trên một luồng, nó sẽ gọi phương thức run() với luồng mới được tạo. Vì vậy, nếu chúng ta không ghi đè phương thức run(), thì luồng mới được tạo sẽ không được gọi nên sẽ không có gì xảy ra.
Ví dụ:
class MyThread extends Thread { //don't override run() method } public class DontOverrideRun { public static void main(String[] args) { System.out.println("main has started."); MyThread thread1=new MyThread(); thread1.start(); System.out.println("main has ended."); } }
17) Sự khác biệt chính giữa phương thức Thread.start() và Thread?run() là gì?
Phương thức Thread.start() (phương thức gốc) của lớp Thread thực hiện công việc chạy phương thức Thread.A run() trong một luồng. Vì vậy, nếu chúng ta gọi trực tiếp Thread.The run() method cũng thực thi trong cùng một luồng. Do đó, nó sẽ không bao giờ giải quyết được mục đích tạo luồng mới.
18) Làm thế nào để tạo một luồng trong Java?
Có hai phương pháp để tạo luồng trong Java.
- Đầu tiên bằng cách triển khai giao diện Runnable và sau đó tạo một đối tượng luồng từ giao diện đó.
- Phương pháp thứ hai là mở rộng lớp luồng.
19) Độ ưu tiên của luồng có nghĩa là gì?
Mỗi luồng có một mức độ ưu tiên. Tuy nhiên, mức độ ưu tiên cao hơn cũng được ưu tiên thực thi. Tuy nhiên, nó cũng phụ thuộc vào việc triển khai Thread Scheduler phụ thuộc vào hệ điều hành. Có thể thay đổi mức độ ưu tiên của luồng, nhưng không đảm bảo rằng luồng có mức độ ưu tiên cao hơn sẽ được thực thi trước.
20) Phương thức join() có tác dụng gì?
Phương thức join() chờ một luồng chết. Nó buộc tất cả các luồng đang chạy dừng thực thi cho đến khi luồng đó tham gia để hoàn thành công việc của nó.
21) Java Shutdown Hook là gì?
Hook tắt Java được sử dụng để dọn dẹp tài nguyên khi JVM tắt. Dọn dẹp tài nguyên có nghĩa là đóng tệp nhật ký, gửi một số cảnh báo hoặc một cái gì đó khác. Hook tắt cần được sử dụng để thực thi mã trước khi JVM tắt.
22) Hai công dụng chính của volatile trong Java là gì?
Luồng được phép lưu giữ giá trị của biến trong bộ nhớ cục bộ. Nếu một biến được đánh dấu là dễ thay đổi, thì mỗi lần sử dụng biến đó, biến đó phải được đọc từ bộ nhớ chính.
Tương tự như vậy, mỗi lần ghi biến, giá trị phải được lưu trữ trong bộ nhớ chính.
23) Làm thế nào để chia sẻ dữ liệu giữa hai luồng trong Java?
Chúng ta có thể lấy dữ liệu giữa các luồng bằng cách sử dụng một đối tượng được chia sẻ hoặc đồng thời cấu trúc dữ liệu giống như BlockingQueue. Nó triển khai mô hình nhà sản xuất-người tiêu dùng bằng cách sử dụng các phương thức wait và thông báo. Nó cũng bao gồm việc chia sẻ các đối tượng giữa hai luồng.
24) Làm thế nào để điều khiển nhiều luồng cùng lúc?
Nhiều luồng có thể được kiểm soát đồng thời nếu chúng được tạo trong một đối tượng ThreadGroup.
25) Phương thức chặn trong Java là gì?
Trong Java, phương thức chặn là phương thức chặn cho đến khi tác vụ hoàn tất. Ví dụ, phương thức accept() của ServerSocket chặn cho đến khi máy khách được kết nối. Ở đây, chặn đề cập đến bất kỳ điều khiển nào sẽ không trả về cho người gọi cho đến khi tác vụ kết thúc.
26) Sự khác biệt chính giữa phương thức wait() và sleep() là gì?
Đợi đã() | Ngủ() |
Phương pháp này được định nghĩa trong lớp Object | Phương pháp này được định nghĩa trong lớp Thread |
Phương thức Wait() giải phóng khóa | Phương pháp này không bao giờ mở được khóa. |
27) Đối tượng bất biến là gì? Nó có thể giúp ích gì trong việc viết ứng dụng đồng thời?
Bất kỳ đối tượng nào cũng có thể được coi là không thể thách thức nếu trạng thái của nó không thay đổi sau khi được xây dựng. Đối tượng bất biến được sử dụng để tạo các ứng dụng đơn giản, đáng tin cậy và đồng thời.
Để tạo ra một đối tượng không thể thay đổi, điều quan trọng là phải làm cho lớp và thành viên của nó là final để khi đối tượng được tạo ra, trạng thái của nó không bị thay đổi.
28) Hãy cho biết sự khác biệt giữa nhường nhịn và ngủ quên?
Khi một tác vụ gọi phương thức yield(), nó sẽ trở về trạng thái sẵn sàng.
Khi một tác vụ gọi phương thức sleep(), nó sẽ trở về trạng thái chờ.
29) ThreadPool là gì?
ThreadPool là một nhóm luồng sử dụng lại một số lượng luồng cố định để thực hiện tác vụ cụ thể.
30) Từ khóa Synchronized có tác dụng gì?
Từ khóa Synchronized có thể được áp dụng cho phương thức tĩnh hoặc không tĩnh. Khi sử dụng Synchronized, chỉ một luồng có thể truy cập vào các phương thức synchronized. Tuy nhiên, trong trường hợp có nhiều luồng đang cố gắng truy cập vào cùng một phương thức. Vào thời điểm đó, các luồng khác phải chờ luồng thực thi. Nó cũng cung cấp một khóa trên đối tượng để ngăn chặn tình trạng chạy đua.
public void synchronized method1(){} public void synchronized staticmethod1(){} public void myMethod(){ synchronized (this){ //synchronized keyword on block of code } }
31) Từ khóa dễ thay đổi là gì?
Từ khóa Volatile là một từ khóa định tính được áp dụng cho một biến khi nó được khai báo. Từ khóa này cho trình biên dịch biết rằng giá trị của biến có thể thay đổi bất kỳ lúc nào mà không cần bất kỳ hành động nào được thực hiện bởi mã.
32) Sự khác biệt chính giữa notify và notifyAll trong Java là gì?
Phương thức Notify() không cung cấp bất kỳ cách nào để chọn một luồng cụ thể, đó là lý do tại sao nó chỉ hữu ích khi một While notifyAll() gửi thông báo đến tất cả các luồng. Nó cũng cho phép chúng cạnh tranh để khóa. Nó cũng đảm bảo rằng ít nhất một luồng sẽ tiến hành thêm.
33) Tham số JVM nào được sử dụng để kiểm soát kích thước ngăn xếp của một luồng?
Để kiểm soát kích thước ngăn xếp của Thread trong Java, tham số Xss được sử dụng.
34) Bạn có thể bắt đầu một luồng hai lần trong Java không?
Không, một khi chủ đề đã được bắt đầu thì không thể bắt đầu lại lần thứ hai.
35) Mục đích của việc sử dụng phương thức yield của lớp thread là gì?
Phương pháp Yield là cách đơn giản nhất để yêu cầu luồng hiện tại từ bỏ CPU để luồng khác. Đây là phương pháp tĩnh và chỉ đảm bảo luồng hiện tại sẽ từ bỏ CPU nhưng không cho biết luồng nào khác cũng tác động đến CPU.
36) Khi nào chúng ta có thể nói rằng luồng không phải là tiến trình nhẹ trong Java?
Luồng không phải là tiến trình nhẹ khi các luồng của cùng một tiến trình đang thực thi đồng thời. Mặc dù vậy, nếu các luồng của các tiến trình khác nhau đang thực thi đồng thời tại thời điểm đó, các luồng trở thành một tiến trình nặng.
37) Có thể đồng bộ hóa hàm tạo của một lớp Java được không?
Theo Java Standard, các constructor không thể được đồng bộ hóa vì các luồng khác không thể nhìn thấy đối tượng trước khi quá trình tạo luồng hoàn tất. Không cần phải đồng bộ hóa constructor Java Objects vì nó sẽ khóa đối tượng đang được xây dựng.
38) Biến tạm thời là gì?
Biến tạm thời là biến không thể tuần tự hóa trong quá trình tuần tự hóa. Biến này được khởi tạo theo giá trị mặc định trong quá trình tuần tự hóa.
Những câu hỏi phỏng vấn này cũng sẽ giúp ích cho bài thi viva(orals) của bạn
Hii
Nó thực sự giúp ích cho tôi trong quá trình chuẩn bị phỏng vấn.
Thật đáng khen ngợi khi viết bài viết này và cung cấp thông tin này.
Tôi khuyên bạn nên
5) Trạng thái của luồng là gì?
Runnable không phải là trạng thái Đang chạy. Nó đã sẵn sàng để chạy
đã cập nhật! Cảm ơn bạn đã chỉ ra điều này
1. Các trạng thái có thể chạy được được xem như một lớp kép ở cấp độ hệ điều hành
2. Hầu như tất cả các ngôn ngữ lập trình đều coi luồng là có thể chạy được hoặc KHÔNG.
3. Một luồng có thể chạy có thể ở trạng thái (sẵn sàng hoặc đang chạy).
4. Bạn có thể có hai luồng ở trạng thái có thể chạy, nhưng chỉ có một luồng tồn tại ở trạng thái "đang chạy",
trong khi luồng thứ hai tồn tại ở trạng thái “đang chạy”.