How to return object from Callable()

后端 未结 3 874
再見小時候
再見小時候 2020-12-11 17:08

I\'m trying to return a 2d array from call(), I\'m having some issues. My code so far is:

//this is the end of main   
Thread t1 = new Thread(new ArrayMultip         


        
相关标签:
3条回答
  • 2020-12-11 17:44

    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));
            }
        }
    
    0 讨论(0)
  • 2020-12-11 17:50

    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.

    0 讨论(0)
  • 2020-12-11 18:05

    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.

    0 讨论(0)
提交回复
热议问题