Как использовать 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 вместо этого (и Эй, нет возвращаемого значения).