Junior
Callable жана Runnable интерфейстеринин айырмасы эмнеде?
sobes.tech AI
AIден жооп
Runnable — бул функционалдык интерфейс, ал ишти аткаруучу тапшырманы көрсөтөт. Ал бир метод run() бар, ал аргументтерди кабыл албайт1 жана маанилерди кайтарбайт. Ал фондук операцияларды аткаруу үчүн колдонулат, алардын жыйынтыгы талап кылынбайт:
Callable — бул параметрленген интерфейс, ал дагы бир ишти аткаруучу тапшырманы көрсөтөт. Ал бир метод call() бар, ал генерик тип <V> (эркин мааниге) кайтарат2 жана исключениелерди чыгара алат (типи Exception). Ал иштер үчүн ылайыктуу, алардын жыйынтыгын колдонуу керек:
Негизги айырмачылыктар:
| Белги | Runnable |
Callable |
|---|---|---|
| Кайтарылуучу маанилер | Жок | Ооба (тип {@code <V>}) |
| Исключениелер | Жок (метод {@code run}) | Ооба (метод {@code call}) |
| Метод | {@code void run()} | {@code V call() throws Exception} |
| Колдонуу | {@code java.lang.Runnable} | {@code java.util.concurrent.Callable} |
Runnable колдонуу мисалы:
// Runnable ишке ашыруу:
Runnable task = new Runnable() {
@Override
public void run() {
// Натыйжасыз операцияны аткарабыз
System.out.println("Runnable иши аткарылды");
}
};
// Туурала:
new Thread(task).start();
Callable колдонуу мисалы:
// Callable ишке ашыруу:
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// Операцияны аткарып, натыйжаны кайтарабыз:
return "Callable иши натыйжасы менен аткарылды";
}
};
// ExecutorService аркылуу ишке ашырабыз:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(task);
try {
// Натыйжаны алабыз:
String result = future.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}