Разница между submit (Runnable) и submit (Callable) в ExcectorService? - PullRequest
0 голосов
/ 13 февраля 2019

Ниже приведен код для реализации класса Runnable

public class ExecutorServiceWithRunnable {

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        Future<emp> submit =null;
        emp emp = new emp();
        for(int i=0;i<5;i++) {
             submit = (Future<emp>) pool.submit(new RunnableClass(emp));
             try {
                    System.out.println(submit.get().getId());
                } catch (InterruptedException | ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }


    }
}
class RunnableClass implements Runnable{

    emp e=null;
    public RunnableClass(emp emp) {
        // TODO Auto-generated constructor stub
        this.e=emp;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+"...."+e.getId());
        e.setId(e.getId()+1);

    }

}
class emp{
    int id;
    String status;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

Введено значение : pool-1-thread-1 .... 0 Исключение в потоке "main" java.lang.NullPointerException at ExecutorServiceWithRunnableCallable.main (ExecutorServiceWithRunnable.java:15)

Ниже приведен код для Callable

public class ExecutorServiceWithRunnableCallable2 {

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        Future<emp> submit =null;
        emp emp = new emp();
        for(int i=0;i<5;i++) {
             submit = pool.submit(new CallableClass(emp));
             try {
                System.out.println(submit.get().getId());
            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }
}
class CallableClass implements Callable<emp>{
    emp e=null;
    public CallableClass(emp emp) {
        // TODO Auto-generated constructor stub
        this.e=emp;
    }

    @Override
    public emp call() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+"...."+e.getId());
        e.setId(e.getId()+1);
        return e;
    }

}

** Получен вывод: ** pool-1-thread-1.... 0 1 pool-1-thread-2 .... 1 2 pool-1-thread-3 .... 2 3 pool-1-thread-4 .... 3 4 pool-1-thread-5 .... 4 5

Так что объясните мне о будущем объекте, возвращаемом методом submit в обоих сценариях.

1 Ответ

0 голосов
/ 13 февраля 2019

A Runnable не возвращает результат.Таким образом, Future::get будет по-прежнему блокироваться до тех пор, пока не будет выполнен runnable, но затем просто вернет null.

submit = (Future<emp>) pool.submit(new RunnableClass(emp));

Это приведение класса выдаст предупреждение, потому что вы на самом деле не получаете Future<emp> здесь,И поскольку вы проигнорировали это, позже вы получили исключение.

Как говорит Javadoc, вы действительно получаете Future<?>, что означает (в данном случае), что вы не можете использовать значение результата.

submit = pool.submit(new CallableClass(emp));

Если вы хотите получить результат, отправьте Callable.Обратите внимание, что приведение классов не было необходимости, оно может вывести общий тип Future из типа Callable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...