2010-04-20 48 views

Trả lời

38

Không, bạn không thể. Cuộc gọi chạy sẽ thực thi phương thức run() trong cùng một luồng, mà không bắt đầu luồng mới.

+1

Này, tôi biết nó không thể ... nhưng tôi không thể nhận được lý do đằng sau nó? –

+5

@Dev er dev, Về mặt kỹ thuật, bạn có thể gọi phương thức run() trực tiếp vì nó là một phần của giao diện công cộng. Vì vậy, câu trả lời của bạn không chính xác về mặt kỹ thuật. –

+1

@sgokhales không chắc chắn nếu nó trở nên rõ ràng nhưng sự khác biệt là 'start' tạo ra một Thread mới và gọi' run' trong thread đó và 'run' tự thực hiện trong Thread nó được gọi từ. – lucidbrot

17

Tại sao chúng ta gọi phương thức start(), lần lượt gọi phương thức run()?

Không có gì là không chính xác. start() lần lượt không gọi phương thức chạy. thay vào đó, nó bắt đầu chuỗi chạy phương thức chạy. Đây là bản địa.

Chúng tôi không thể trực tiếp thực hiện cuộc gọi đến run()?

Nếu bạn gọi run() trực tiếp bạn không bắt đầu chuỗi, bạn chỉ cần thực hiện phương thức trên cùng một phương thức người gọi.

Vui lòng đưa ra ví dụ khi có sự khác biệt.

Có hàng triệu trên web. Do đó tôi không lặp lại.

0

Vì start() không chỉ gọi run(). Nó bắt đầu một chuỗi mới và trong chuỗi đó cuộc gọi chạy().

0

bạn không thể chạy trực tiếp phương thức run(). Bất cứ khi nào bắt đầu luồng của bạn bằng cách sử dụng thread.start(), thì phương thức run() đã được gọi và thực hiện thao tác tiếp theo.

4

Thực ra, thread.start() tạo một chuỗi mới và có kịch bản thực thi riêng.

nhưng thread.run() không tạo bất kỳ chuỗi mới nào, thay vào đó nó thực thi phương thức chạy trong luồng đang chạy.

Vì vậy, nếu bạn đang sử dụng thread.run() thì hãy nghĩ rằng việc sử dụng đa luồng là gì nếu bạn chỉ muốn một luồng thực thi tất cả các phương thức chạy.

+1

'thread.start()' nội bộ được gọi là phương thức chạy của luồng. – aditya

0

khác biệt chính là khi chương trình gọi start() phương pháp một chủ đề mới được tạo ra và mã bên run() phương pháp được thực hiện trong mới Thread.If bạn gọi run() phương pháp trực tiếp không có Chủ đề mới được tạo và mã bên trong run() sẽ thực thi trên Thread hiện tại.

Hầu hết thời gian gọi run() là lỗi hoặc lỗi lập trình bởi vì người gọi có ý định gọi bắt đầu() để tạo chuỗi mới và lỗi này có thể được phát hiện bởi nhiều công cụ bảo mật mã tĩnh như findbugs. Nếu bạn muốn thực hiện nhiệm vụ tốn thời gian hơn luôn gọi phương thức start() nếu không thì luồng chính của bạn sẽ bị mắc kẹt trong khi thực hiện nhiệm vụ tốn thời gian nếu bạn gọi phương thức run() trực tiếp. Một sự khác biệt giữa bắt đầu và chạy trong chuỗi Java là bạn không thể gọi phương thức start() hai lần trên đối tượng thread.khi bắt đầu, lệnh gọi thứ hai của start() sẽ ném IllegalStateException trong Java trong khi bạn có thể gọi phương thức run() hai lần.

0

Nếu bạn gọi run() trực tiếp, mã sẽ được thực hiện trong chuỗi cuộc gọi. Bằng cách gọi start(), một luồng mới được tạo ra ngoài luồng chính và được thực thi song song.

0

start(); được đồng bộ hóa và run(); là phương pháp đơn giản/thông thường. Giống như java biết bắt đầu thực hiện từ phương thức main();. Như chủ đề biết bắt đầu thực hiện từ run();

Đây là mã nguồn từ Thread Class:

run(); mã:

@Override 
public void run() { // overriding from Runnable 
     if (target != null) { 
      target.run(); 
     } 
} 

start(); mã:

public synchronized void start() { 
     /** 
     * This method is not invoked for the main method thread or "system" 
     * group threads created/set up by the VM. Any new functionality added 
     * to this method in the future may have to also be added to the VM. 
     * 
     * A zero status value corresponds to state "NEW". 
     */ 
     if (threadStatus != 0) 
      throw new IllegalThreadStateException(); 

     /* Notify the group that this thread is about to be started 
     * so that it can be added to the group's list of threads 
     * and the group's unstarted count can be decremented. */ 
     group.add(this); 

     boolean started = false; 
     try { 
      start0(); 
      started = true; 
     } finally { 
      try { 
       if (!started) { 
        group.threadStartFailed(this); 
       } 
      } catch (Throwable ignore) { 
       /* do nothing. If start0 threw a Throwable then 
        it will be passed up the call stack */ 
      } 
     } 
    } 

Nói tóm lại start(); là người quản lý các chủ đề, cách quản lý v.v. và run(); là điểm bắt đầu hoạt động của luồng.

-1

này được công việc thực hiện theo phương pháp start

synchronized public void start() 
{ 
    //it calls start0() method internally and start0() method does below 
    //create a real child thread and register with thread scheduler 
    //create runtime stack for child thread 
    //call run() on underlying Runtime object 
} 
Các vấn đề liên quan