2009-09-29 39 views
6

Tôi có một mã đăng nhập cần được thực hiện sau khi tất cả Threads được thực thi.Làm thế nào để thực hiện một đoạn mã chỉ sau khi tất cả các chủ đề được thực hiện

Thread t1 = new MyThread(); 
Thread t2 = new MyThread(); 
t1.run(); 
t2.run(); 

doLogging(); 

Chỉ có cách nào để thực thi doLogging() chỉ sau khi cả hai luồng được xử lý xong. Bây giờ, doLogging() được gọi ngay khi t1 và t2 được bắt đầu.

+2

Cần chỉ ra rằng kể từ khi bạn đang gọi chạy thay vì bắt đầu bạn đã nhận được hành vi mong muốn. –

Trả lời

19

Chỉ join() chủ đề trước doLogging() cuộc gọi của bạn:

t1.join(); 
t2.join(); 

// the following line will be executed when both threads are done 
doLogging(); 

Lưu ý rằng thứ tự của join() cuộc gọi không quan trọng nếu bạn muốn chờ đợi cho tất cả các chủ đề của bạn.

+0

Cảm ơn. Điều đó làm việc :) – shafi

+0

Lưu ý rằng nếu bạn đang sử dụng Java 1.5 hoặc mới hơn thì java.util.concurrent mới nên được ưu tiên hơn so với lập trình luồng cấp thấp (xem câu trả lời của Gregory Mostizky). –

+0

@Jim: với Java 1.5 hoặc mới hơn, tôi thậm chí sẽ không sử dụng CountDownLatch cho một thứ như vậy, mà là một Executor đơn giản. –

0

Nếu bạn đang chạy mã từ chuỗi chính, hãy nhớ rằng nó sẽ khiến giao diện người dùng bị treo cho đến khi cả hai chuỗi hoàn tất. Đây có thể không phải là hiệu ứng mong muốn.

Thay vào đó, bạn có thể xem xét một công trình trong đó mỗi chuỗi đồng bộ hóa trên đối tượng Logger của bạn và thực hiện cuộc gọi đến trong cấu trúc đó. Vì tôi không biết bạn đang cố gắng hoàn thành những gì, giải pháp khác là đề xuất Joachim, chỉ đặt mã đó trong một chuỗi.

6

Ngoài giải pháp join(), còn có một thứ gọi là CountDownLatch trong thư viện java.util.concurrent. Nó cho phép bạn khởi tạo nó đến một số nhất định và sau đó đợi cho đến khi nó được nhấn số lần được chỉ định.

ví dụ đơn giản:

CountDownLatch latch = new CountDownLatch(NUMBER_OF_THREADS); 
for(int i=0; i<NUMBER_OF_THREADS;i++) 
    new Thread(myCode).start(); 

latch.await(); 

Các chốt phải được nhấn một cách rõ ràng bởi các đề người lao động để làm việc này mặc dù:

latch.countDown() 
+0

+1 cho java.util.concurrent. Tính năng mới này làm cho hầu hết các lập trình luồng cấp thấp trong Java không cần thiết. –

Các vấn đề liên quan