Runnable và Callable cả hai giao diện chức năng. Các lớp đang triển khai các giao diện này được thiết kế để được thực thi bởi một luồng khác.
Luồng có thể được bắt đầu bằng Ruunable và chúng là hai cách để bắt đầu một luồng mới:một là bằng cách phân lớp con lớp Thread và một cách khác là triển khai giao diện Runnable.
Lớp luồng không có hàm tạo để có thể gọi, vì vậy chúng ta nên sử dụng lớp ExecutorService để thực thi luồng.
Sr. Không. | Phím | Runnable | Có thể gọi được |
---|---|---|---|
1 | Gói | Nó thuộc về Java.lang | Nó thuộc về java.util.concurrent |
2 | Tạo chuỗi | Chúng ta có thể tạo luồng bằng cách chuyển runnable làm tham số. | Chúng tôi không thể tạo chuỗi bằng cách chuyển có thể gọi làm tham số |
3 | Loại Trả lại | Ruunable không trả về bất cứ thứ gì | Có thể gọi có thể trả về kết quả |
4. | Phương pháp | Nó có phương thức run () | Nó có phương thức call () |
5 | Thực thi Hàng loạt | Nó không thể được sử dụng để thực thi hàng loạt tác vụ | Nó có thể được sử dụng để thực thi hàng loạt tác vụ bằng cách gọi invokeAll (). |
Ví dụ về Runnable
public class RunnableExample implements Runnable { public void run() { System.out.println("Hello from a Runnable!"); } public static void main(String args[]) { (new Thread(new RunnableExample())).start(); } }
Ví dụ về Callable
public class Main { public static void main(String args[]) throws InterruptedException, ExecutionException { ExecutorService services = Executors.newSingleThreadExecutor(); Future<?> future = services.submit(new Task()); System.out.println("In Future Object" + future.get()); } } import java.util.concurrent.Callable; public class Task implements Callable { @Override public String call() throws Exception { System.out.println("In call"); String name = "test"; return name; } }