Sobes.tech
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();
}