Nói một cách dễ hiểu thì Runnable trong Java là gì? [đóng cửa]


92

"Chạy được" trong Java, theo thuật ngữ của giáo dân là gì? Tôi là một học sinh lập trình AP ở trường trung học, với nhiệm vụ là nghiên cứu hoặc tìm kiếm từ những người khác "có thể chạy được" là gì (chúng tôi chỉ mới tham gia OOP và chưa chạm vào chủ đề).


Chỉ có một dòng hữu ích trong tài liệu API: "Hợp đồng chung của phương thức chạy là nó có thể thực hiện bất kỳ hành động nào."
Tom Hawtin - tackline

Một nhiệm vụ nghiên cứu thú vị hơn sẽ là: "Có thể dừng lại" trong Java là gì, theo thuật ngữ của giáo dân. Todays Giảng viên là như vậy ...
Udo Klimaschewski

8
@UdoKlimaschewski - anh chàng là học sinh trung học, không phải sinh viên đại học hay sau đại học. Kỳ vọng của giảng viên này tương xứng với trình độ của sinh viên ... IMO. Tuy nhiên, tôi đồng ý rằng "đầu tiên hỏi trên SO" KHÔNG phải là kỹ thuật nghiên cứu thích hợp cho một người nào đó ở cấp OP.
Stephen C

Câu trả lời:


188

Runnable về cơ bản là một loại lớp (Runnable là một Giao diện) có thể được đưa vào một luồng, mô tả những gì mà luồng phải làm.

Các giao diện Runnable đòi hỏi của lớp để thực hiện phương pháp này run()như sau:

public class MyRunnableTask implements Runnable {
     public void run() {
         // do stuff here
     }
}

Và sau đó sử dụng nó như thế này:

Thread t = new Thread(new MyRunnableTask());
t.start();

Nếu bạn không có Runnablegiao diện, lớp Thread, lớp chịu trách nhiệm thực thi nội dung của bạn trong luồng khác, sẽ không có lời hứa tìm một run()phương thức trong lớp của bạn, vì vậy bạn có thể gặp lỗi. Đó là lý do tại sao bạn cần triển khai giao diện.

Nâng cao: Loại ẩn danh

Lưu ý rằng bạn không cần phải xác định một lớp như bình thường, bạn có thể thực hiện tất cả nội tuyến đó:

Thread t = new Thread(new Runnable() {
    public void run() {
        // stuff here
    }
});
t.start();

Điều này tương tự như trên, chỉ là bạn không tạo một lớp có tên khác.


67
Đây là một câu trả lời tuyệt vời bác bỏ hoàn toàn tuyên bố rằng câu hỏi "không thể được trả lời một cách hợp lý ở dạng hiện tại".
Russell Silva

1
Tôi biết đã lâu nhưng tôi có một câu hỏi. Chủ đề chỉ được chạy một lần hay tiếp tục chạy đi chạy lại bên trong chương trình khi tôi bắt đầu một chủ đề?
gamo

5
Luồng được chạy cho đến khi runphương thức kết thúc, sau đó luồng được đóng. Nếu bạn muốn một chuỗi chạy đi chạy lại, hãy đặt một vòng lặp bên trong runphương thức.
opatut

2
Hoặc đơn giản là sử dụng một Java chức năng 8 lambda:new Thread(() -> System.out.println("hello from other thread")).start();
Gabe

9

Runnable là một giao diện được định nghĩa như vậy:

interface Runnable {
    public void run();
}

Để tạo một lớp sử dụng nó, chỉ cần xác định lớp đó là (public) class MyRunnable implements Runnable {

Nó có thể được sử dụng mà không cần tạo một Thread mới. Về cơ bản, đó là giao diện cơ bản của bạn với một phương thức duy nhất, chạy, có thể được gọi.

Nếu bạn tạo một Thread mới với tham số là runnable, nó sẽ gọi phương thức run trong một Thread mới.

Cũng cần lưu ý rằng Threads hiện thực Runnablevà điều đó được gọi khi Thread mới được tạo (trong luồng mới). Việc triển khai mặc định chỉ gọi bất kỳ Runnable nào mà bạn đã đưa vào hàm tạo, đó là lý do tại sao bạn có thể thực hiện new Thread(someRunnable)mà không cần ghi đè runphương thức của Thread .


Bạn đang nói rằng về cơ bản không có sự khác biệt giữa việc kế thừa Thread hoặc triển khai Runnable? Thread khi sử dụng Runnable có được sử dụng như một trình bao bọc cũng như trình thực thi không?
opatut

Tôi nói không có sự khác biệt giữa [mở rộng chủ đề và trọng chạy] và [tạo ra một thể hiện mới của Chủ đề với một Runnable có phương pháp chạy cùng]
Alex Coleman

Đúng vậy. Nhưng có thực sự không có sự khác biệt, không phải hiệu suất - cũng không phải là khác?
opatut

3
@AlexColeman - có một sự khác biệt lớn . Nếu bạn mở rộng Threadtổng hợp luồng thì rất khó và nếu bạn không triển khai gộp luồng, bạn sẽ phải trả chi phí đáng kể cho việc tạo luồng mới mọi lúc. Ngược lại, chỉ cần triển khai Runnablecó nghĩa là bạn có thể dễ dàng sử dụng những thứ như ThreadPoolExecutorServicehoặc nhóm luồng của bên thứ ba.
Stephen C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.