Runnable 및 Callable 모두 기능적 인터페이스입니다. 이러한 인터페이스를 구현하는 클래스는 다른 스레드에서 실행되도록 설계되었습니다.
스레드는 Ruunable로 시작할 수 있으며 새 스레드를 시작하는 두 가지 방법이 있습니다. 하나는 Thread 클래스를 서브클래싱하는 것이고 다른 하나는 Runnable 인터페이스를 구현하는 것입니다.
Thread 클래스에는 호출 가능한 생성자가 없으므로 스레드를 실행하려면 ExecutorService 클래스를 사용해야 합니다.
| Sr. 아니요. | 키 | 실행 가능 | 호출 가능 |
|---|---|---|---|
| 1 | 패키지 | Java.lang에 속합니다. | java.util.concurrent에 속합니다. |
| 2 | 스레드 생성 | runnable을 매개변수로 전달하여 스레드를 생성할 수 있습니다. | 콜러블을 매개변수로 전달하여 스레드를 생성할 수 없습니다. |
| 3 | 반환 유형 | 실행 가능은 아무 것도 반환하지 않습니다. | 콜러블은 결과를 반환할 수 있습니다. |
| 4. | 메소드 | run() 메서드가 있습니다. | call() 메서드가 있습니다. |
| 5 | 대량 실행 | 작업의 대량 실행에는 사용할 수 없습니다. | invokeAll()을 호출하여 태스크의 대량 실행에 사용할 수 있습니다. |
실행 가능의 예
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();
}
} 호출 가능의 예
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;
}
}