How to return object from Callable() How to return object from Callable() multithreading multithreading

How to return object from Callable()


Here's some code demonstrating use of the Callable<> interface:

public class test {public static void main(String[] args) throws ExecutionException, InterruptedException {    Callable callable = new Callable() {        @Override        public int[][] call() throws Exception {            int[][] array = new int[5][];            for (int i = 0; i < array.length; i++) {                array[i] = new int[]{5 * i, 5 * i + 1, 5 * i + 2, 5 * i + 3};            }            return array;        }    };    ExecutorService service = Executors.newFixedThreadPool(2);    Future<int[][]> result = service.submit(callable);    int[][] intArray = result.get();    for (int i = 0; i < intArray.length; i++) {        System.out.println(Arrays.toString(intArray[i]));    }}}

What this does is construct an object that can be submitted to an executor service. It's fundamentally the same as a Runnable, except that it can return a value; what we're doing here is creating an ExecutorService with two threads, then submitting this callable to the service.

The next thing that happens is the result.get(), which will block until the callable returns.

You probably shouldn't do the Thread management yourself.


Adding to Joseph Ottinger's answer, to pass values to be used inside Callable's call() method, you can use closures:

    public static Callable<Integer[][]> getMultiplierCallable(final int[][] xs,            final int[][] ys, final int length) {        return new Callable<Integer[][]>() {            public Integer[][] call() throws Exception {                Integer[][] answer = new Integer[length][length];                answer = multiplyArray(xs, ys, length);                return answer;            }        };    }    public static void main(final String[] args) throws ExecutionException,            InterruptedException {        final int[][] xs = {{1, 2}, {3, 4}};        final int[][] ys = {{1, 2}, {3, 4}};        final Callable<Integer[][]> callable = getMultiplierCallable(xs, ys, 2);        final ExecutorService service = Executors.newFixedThreadPool(2);        final Future<Integer[][]> result = service.submit(callable);        final Integer[][] intArray = result.get();        for (final Integer[] element : intArray) {            System.out.println(Arrays.toString(element));        }    }


In addition to Joseph's excellent answer, note that your method signature is int[][] call(int[][]). If you reference the Callable javadoc you'll see that the Callable's call() method does not take any arguments. So your method is an overload, not an override, and so won't be called by anything that is calling Callable's call() method.