Как использовать Callable с типом возврата void?
Я работаю над проектом, в котором у меня есть несколько интерфейсов и два класса реализаций, которые должны реализовать эти два интерфейса.
предположим, мой первый интерфейс -
public Interface interfaceA {
public void abc() throws Exception;
}
и его реализации -
public class TestA implements interfaceA {
// abc method
}
я называю это так -
TestA testA = new TestA();
testA.abc();
теперь мой второй интерфейс -
public Interface interfaceB {
public void xyz() throws Exception;
}
и его реализации -
public class TestB implements interfaceB {
// xyz method
}
я называю это так -
TestB testB = new TestB();
testB.xyz();
Постановка Задачи:-
теперь мой вопрос - есть ли способ я могу выполнить эти два класса параллельное? Я не хочу запускать его последовательно.
значит, я хочу бежать TestA
и TestB
реализация параллельно? Возможно ли это сделать?
Я думал использовать вызываемый здесь, но не уверен, как использовать вызываемый с типом void return здесь -
давайте использовать класс TestB в качестве примера:
public interface interfaceB {
public void xyz() throws Exception;
}
public class TestB implements interfaceB, Callable<?>{
@Override
public void xyz() throws Exception
{
//do something
}
@Override
public void call() throws Exception
{
xyz();
}
}
выше код дает ошибку компиляции..
обновление:-
похоже, что многие люди предлагают использовать Runnable вместо callable. Но не уверен, как использовать Runnable здесь, чтобы я мог выполнить TestA and TestB
параллельно.
2 ответов
можно использовать java.ленг.Нить для параллельного выполнения. Однако, в большинстве случаев проще использовать java.утиль.параллельный.ExecutorService. Последний предоставляет метод отправки вызвать и возвращает будущее получить результат позже (или дождаться завершения).
Если testA.abc () и testB.xyz () должно выполняться параллельно, вы используете ExecutorService выполнить первый в отдельном потоке, тогда как последний выполняется в исходном потоке. Затем вы ждете завершения первого для синхронизации.
ExecutorService executor = ... // e.g. Executors.newFixedThreadPool(4);
Future<Void> future = executor.submit(new Callable<Void>() {
public Void call() throws Exception {
testA.abc();
return null;
}
});
testB.xyz();
future.get(); // wait for completion of testA.abc()
зачем вам нужна пустота для запуска чего-то параллельно? Например, если вам не нужно возвращаемое значение, вы можете просто возвратить null
.
чтобы сделать что-то параллельное, вам нужно использовать threading/scheduling. Я бы лично рекомендовал избегать Callables и использовать Runnables вместо этого (и Эй, нет возвращаемого значения).