Hỏi về thread và cách truyền variable vào thread

1.cho mình hỏi nếu truyền 1 biến local từ bên ngoài vào trong 1 thread thì có xảy ra việc giá trị các biến không chính xác không , như bên php thì có Closure hỗ trợ truyền biến vào thread , còn java mình thấy nó bắt phải khai báo final mới cho truyền vào

public void methodA(){
	for (ObjectA a : listsobject) {
        new Thread() {
            public void run() {
                a.read();
                }
        }.start();
         
    }
}
  1. khi kết thúc 1 method thì các biến sẽ bị hủy , vậy nếu truyền biến vào thread thì thread thực hiện sau khi method kết thúc thì biến đâu mà truyền vào thread ??
1 Like

Bạn sẽ bị memoryLeak khi biến tham chiếu bị destroyed.
Trường hợp của bạn phải dùng AsyncTask hoặc RxJava.

4 Likes

Bị leak khi biến tham chiếu bị destroyed là sao nhỉ. Bạn nên nói rõ hơn cho bạn đó thì mới hiểu được. Ngoài ra AsyncTask hay RxJava không phải là chìa khóa vạn năng. Vẫn leak như thường nếu sử dụng không đúng

3 Likes
  1. Java không cho phép một biến được gán lại (biến final) khi truyền vào thread. Tức là trong method run() của bạn không được phép có dòng a = .... Nếu bạn muốn a có thể thay đổi sau khi thread chạy xong thì bạn phải sử dụng (tất nhiên bạn không được gán a = ... trong vòng for nhưng mình nói ở trường hợp tổng quát):
final ObjectA b = a;
new Thread(() -> {
                     b.read();
                 }).start();
a = ...
  1. Khi kết thúc một method thì biến sẽ bị huỷ, nhưng đối tượng / giá trị vẫn tồn tại cho đến khi không còn cái gì gọi đến đối tượng đó. Trong method bạn truyền đối tượng cho thread chứ không phải là biến. Mặc dù hình thức là bạn truyền biến a vào, nhưng thực tế là bạn truyền ObjectA@5x1541 chẳng hạn, đang được trỏ đến bởi biến ‘a’, và thread sẽ chạy với object đó.
4 Likes

Thì Hà Mã Tím đáng yêu trả lời 2 câu hỏi bằng 2 dòng rồi đó mà :no_mouth::no_mouth::no_mouth:
Dòng 1 cho câu bạn ấy hỏi tại sao lại final, dòng 2 là cho câu 2 bạn ấy hỏi giải pháp để truyền biến.
Nếu bạn có thông tin thì bổ sung dùm Hà Mã Tím đáng yêu đi.
Hà Mã Tím đáng yêu đang làm biếng nên không giải thích dài dòng được, có từ khóa trong câu trả lời hết rồi thớt tự tìm kiếm mới nhớ chứ :expressionless::expressionless::expressionless::expressionless::expressionless:

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