2012-02-09 29 views
7

Đây hoàn toàn là một câu hỏi lý thuyết vì tôi không chắc chắn các điều kiện gây ra vấn đề này sẽ là phổ biến.Làm thế nào để dừng thread trở về trước khi tham gia() được gọi là

Nói ví dụ bạn có một chủ đề mà bạn kick off với nó là bắt đầu phương pháp:

Thread c = new Thread(); 
c.start(); 

Sau đó trực tiếp sau đó, bạn gọi phương thức Join() trên thread nói với các phương pháp bạn đang ở để chờ đợi cho đến khi chuỗi đã được thực hiện để tiếp tục.

c.join(); 

Không phải là nó một khả năng rằng các chủ đề có thể có thể được thực hiện và kết thúc trước khi phương pháp tham gia được gọi là, do đó để lại phương pháp này không biết rằng nó phải đợi cho c để kết thúc trước khi nó tiếp tục? Tôi cho rằng bạn có thể thử gọi phương thức join() trước khi bạn gọi phương thức start(), nhưng bất cứ khi nào tôi thử điều này trong các trường hợp thử nghiệm, có một lỗi.

Bất kỳ ai biết có thể khắc phục sự cố này hoặc JVM có xử lý được không? Như tôi đã nói tôi đã không thể kích hoạt tình huống này, nhưng về mặt lý thuyết thì có thể ...

+0

Tại sao lại là sự cố? –

+0

Với câu trả lời mà những người khác đã mở, sẽ không sai khi kết luận rằng tham gia() trên bất kỳ Chủ đề nào khác, chỉ là kiểm tra tiêu chí, cho Chủ đề gọi. – soufrk

Trả lời

10

Theo mã nguồn Thread#join(long millis), phương pháp isAlive() được sử dụng để kiểm tra trạng thái luồng.

/** 
* Tests if this thread is alive. A thread is alive if it has 
* been started and has not yet died. 
* 
* @return <code>true</code> if this thread is alive; 
*   <code>false</code> otherwise. 
*/ 
public final native boolean isAlive(); 

Phương pháp này rõ ràng là trả false nếu thread đã kết thúc, vì vậy thread.join() sẽ ngay lập tức thoát.

0

Ngữ nghĩa của phương thức kết nối có nghĩa là "đợi cho đến khi chuỗi nối kết kết thúc", và đó là tiêu chuẩn khá nhiều trong mọi ngôn ngữ lập trình hỗ trợ đa luồng. Do đó, hoàn toàn có thể tham gia một chuỗi đã hoàn thành, JVM sẽ chỉ phát hiện ra rằng nó đã hoàn tất và tiến hành thực thi mã.

6

c.join() có nghĩa là chuỗi hiện đang thực hiện phải đợi c để hoàn tất trước khi hoàn tất. Nếu c thực thi hoàn toàn trước khi thực hiện cuộc gọi đến c.join(), thì điều kiện đó được thỏa mãn, vì c đã hoàn thành việc thực thi. Phương pháp mà bạn đang gọi c.join() sẽ không "biết về điều đó"; c.join() sẽ giống như một no-op.

0

tham gia() sẽ trở lại ngay lập tức nếu luồng không chạy.

2

Bạn có thể gọi join() trước khi Chủ đề được bắt đầu nhưng do Chủ đề chưa được bắt đầu join() sẽ trả về ngay lập tức.

Nếu join() được gọi sau khi Chủ đề được bắt đầu và Chủ đề đã kết thúc, join() cũng sẽ trở lại ngay lập tức.

Thời gian duy nhất join() sẽ chặn là trong khi Thread.isAlive()

Mã này hoạt động OK ...

public static void main(String[] args) throws InterruptedException 
    { 
     Thread t = new Thread(new Runnable() 
     { 
     public void run() 
     { 
      System.out.println("thread"); 
     } 
     }); 
     t.join(); 
     System.out.println("joined"); 

     Thread.sleep(2000); 
     System.out.println("call start"); 
     t.start(); 
    } 
Các vấn đề liên quan