2013-04-05 19 views
7

Tôi không hiểu sự khác biệt giữa bắt đầu và chạy một chuỗi, tôi đã thử nghiệm cả hai phương pháp và chúng kết quả đầu ra giống nhau, trước tiên tôi đã sử dụng kết hợp run() và bắt đầu trên cùng một sợi và họ đã làm chức năng tương tự như sau:Sự khác biệt giữa chạy và bắt đầu một chủ đề

public class TestRunAndStart implements Runnable { 
public void run() { 
    System.out.println("running"); 
} 
public static void main(String[] args) { 
    Thread t = new Thread(new TestRunAndStart()); 
    t.run(); 
    t.run(); 
    t.start(); 
} 

}

đầu ra là:

running 
running 
running 

sau đó tôi thấy javadoc của phương pháp run() nói rằng: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns vì vậy tôi cố gắng sử dụng các phương pháp run() mà không có một Runnable riêng biệt như sau:

public class TestRun extends Thread { 
public void run(){ 
    System.out.println("Running Normal Thread"); 
} 
public static void main(String[]args){ 
    TestRun TR=new TestRun(); 
    TR.run(); 
    } 

} 

và nó cũng thực thi method run() và in Running Normal Thread mặc dù nó được xây dựng mà không có một Runnable riêng biệt! nên sự khác biệt chính giữa hai phương pháp

+0

không trùng lặp! – naXa

+0

Tuy nhiên đã quá muộn. Nhưng có thể hữu ích cho người khác.Đặt lại câu lệnh SOP phương thức chạy theo "System.out.println ("chạy thread ..." + Thread.currentThread(). getName()); "và sau đó thực hiện chương trình của bạn. Bạn sẽ thấy sự khác biệt. Đầu ra là" chạy thread ... main chạy thread ... main chạy thread ... Thread-0 " – user320676

Trả lời

23

Thread.run() là những gì không đẻ trứng một chủ đề mới trong khi Thread.start() không, tức là Thread.run thực sự chạy trên cùng một sợi như của người gọi trong khi Thread.start() tạo ra một chủ đề mới mà trên đó các nhiệm vụ được chạy.

+0

ok, nhưng tôi không hiểu ý nghĩa của" Nếu chủ đề này được xây dựng bằng cách sử dụng một đối tượng Runnable chạy riêng "là lớp TestRun trong ví dụ của tôi được coi là được xây dựng mà không có Runnable riêng ?? –

+0

@JavaPlayer Kiểm tra *** [this] (http://stackoverflow.com/questions/262816/when-would-you-call-javas-thread-run-instead-of-thread-start) *** đăng câu trả lời của bạn –

11

Khi bạn gọi run, bạn chỉ đang thực hiện phương thức run trong chuỗi hiện tại. Mã của bạn do đó sẽ không được đa luồng.

Nếu bạn gọi start, điều này sẽ bắt đầu một chuỗi mới và phương thức run sẽ được thực hiện trên chuỗi mới này.

0

Trong ví dụ đầu tiên, bạn đang gọi phương thức run() trực tiếp từ chuỗi chính, và sau đó một lần từ một chuỗi riêng biệt bằng cách gọi t.start().

Trong trường hợp thứ hai, t.start() tạo ra một bối cảnh luồng riêng biệt và từ ngữ cảnh đó, hãy gọi t.run().

Bạn cũng bao gồm các tài liệu cho run() phương pháp:

Nếu chủ đề này được xây dựng sử dụng một đối tượng chạy Runnable riêng biệt, sau đó phương pháp chạy mà Runnable đối tượng được gọi là; nếu không, phương thức này không có gì và trả lại

Điều này đúng, nếu bạn không ghi đè phương thức run(), thì nó sẽ đơn giản trở lại, khiến cho chuỗi đó chấm dứt. Bạn đã ghi đè phương thức run() trong đối tượng Thread của bạn, vì vậy phương thức override (không thực hiện gì) không được gọi.

1

Chủ đề trải qua các giai đoạn khác nhau trong suốt vòng đời của nó. Khi bạn gọi tới số thì phương thức start() ở trạng thái chạy được và không phải trạng thái đang chạy.

Sau đó, trình lên lịch sẽ chồng lên một luồng từ nhóm chủ đề đang đợi để được thực thi và đặt nó trong giai đoạn chạy . Tại thời điểm này thực hiện thực tế của thread diễn ra.

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