Передача аргумента в вызов функции из вызываемого интерфейса - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь создать служебную библиотеку, которая добавляет задачи в очередь ThreadPoolExecutor.Я хочу принять список / массив объектов, вызываемую функцию и список аргументов функции для передачи в вызываемую функцию.Теперь я хочу передать этот список или аргументы в вызове функции, который я делаю из вызываемого интерфейса, но в вызываемом интерфейсе есть только одна функция, которая не принимает никаких аргументов.

Может ли кто-нибудь помочь мне в перепроектировании структуры?Я хочу, чтобы клиенты этой библиотеки вызывали одну функцию с вышеупомянутыми аргументами, и библиотека должна обрабатывать все.

Мой текущий класс выглядит следующим образом:

public class ThreadPoolExecutorUtils {

    private ExecutorService executorService;

    /**
     * Initialize Executor service with given number of threads
     * @param threadCount : number of threads on the thread pool
     */
    public ThreadPoolExecutorUtils(int threadCount) {
        executorService = Executors.newFixedThreadPool(threadCount);
    }

    /**
     * Add the task to the queue of current threadpool executor
     * @param callableFunc: Function to be called from every thread
     */
    public <T> void scheduleTask(Callable<T> callableFunc) {
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    callableFunc.call();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    /**
     * Blocks until all tasks have completed execution after a shutdown
     * request, or the timeout occurs, or the current thread is
     * interrupted, whichever happens first.
     * @param timeOutSeconds : The maximum time in seconds to wait
     */
    public void awaitCompletion(int timeOutSeconds) {
        executorService.shutdown();
        try {
            executorService.awaitTermination(timeOutSeconds, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            executorService.shutdownNow();
        }
    }

}

В этом клиентедолжен создать объект ThreadPoolExecutorUtils, перебрать свой список задач и передать отдельную вызываемую функцию.Я хочу абстрагироваться от этого для клиента.

1 Ответ

0 голосов
/ 12 февраля 2019

Рассматривали ли вы что-нибудь из пакета java.util.function.Я думаю, что он более подходит для вашего случая использования, чем Callable, что-то вроде BiConsumer или BiFunction.Поскольку вывод Callable не используется в вашем примере кода, я не вижу необходимости его использовать.

...