Как вернуть объект из Callable()
Я пытаюсь вернуть 2D-массив из call (), у меня возникли некоторые проблемы. Мой код до сих пор:
//this is the end of main
Thread t1 = new Thread(new ArrayMultiplication(Array1, Array2, length));
t1.start();
}
public int[][] call(int[][] answer)
{
int[][] answer = new int[length][length];
answer = multiplyArray(Array1, Array2, length); //off to another function which returns the answer to here
return answer;
}
этот код компилируется, это не отвечает на мой массив. Я уверен, что, вероятно, использую неправильный синтаксис, но я не могу найти хороших примеров.
EDIT: немного изменил его
3 ответов
добавление к ответу Джозефа Оттингера, чтобы передать значения, которые будут использоваться внутри метода Callable call (), вы можете использовать замыкания:
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));
}
}
вот некоторый код, демонстрирующий использование вызываемого интерфейса:
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]));
}
}
}
это создает объект, который может быть отправлен в службу исполнителя. Это принципиально то же самое, что и Runnable, за исключением того, что он может возвращать значение; то, что мы делаем здесь, создает ExecutorService с двумя потоками, а затем отправляет этот вызываемый сервис.
следующее, что происходит, - это результат.get (), который будет блокировать до вызываемого возвращается.
вы, вероятно, не должны делать управление потоками самостоятельно.
в дополнение к отличному ответу Джозефа обратите внимание, что ваша подпись метода int[][] call(int[][])
. Если вы ссылаетесь на Callable
javadoc вы увидите, что Callable
' s call()
метод не принимает никаких аргументов. Таким образом, ваш метод является перегрузкой, а не переопределением, и поэтому не будет вызываться ничем, что вызывает Callable
' s call()
метод.