谁能举例说明如何在Java的InvokeAll()可调用方法中使用泛型?

问题描述 投票:0回答:1

我有两个单独的taskList,并且希望使用通用/通用方法在ExecutorService中使用invokeAll()来执行这两个方法。我能够得到每个TaskList的响应和invokeAll()。但是无法编写一个公共代码来执行并获取结果。

LocateUser任务:

List<LocateUser> taskList = new ArrayList<>();
taskList.add(new BSLocateUserClient(url, locateName, username, token));
List<Future<LocateUserResponse>> locateResponse = executor.invokeAll(taskList);
locateResponse.forEach(response -> {
    LocateUserResponse user;
    try {
        user = response.get();
    } catch (InterruptedException | ExecutionException e) {
        //
    } finally {
        executor.shutdown();
    }
});

LoginResponse任务:

List<LoginUser> taskList = new ArrayList<>();
for (String url : urls) {
    taskList.add(new BSWebserviceClient(url, username, password, isOciLogin22, ociWebServiceTemplateFactory));
}

List<Future<LoginResponse>> response = executor.invokeAll(taskList);
List<LoginResponse> loginResponses = new ArrayList<>();
response.forEach(loginResponse -> {
    try {
        LoginResponse loginDetails = loginResponse.get();
    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        executor.shutdown();
    }
});

您能帮我解决这个问题吗?

java executorservice
1个回答
0
投票

我通过添加一个接口ResponseTask来实现这一目标,并将该接口实现为两个响应类,并为invokeAll和getResponse创建通用/通用方法。

public interface ResponseTask extends Serializable {
} 

invokeAll

public <T extends ResponseTask> List<T> invokeAll(Set<Callable<ResponseTask>> callables, int threadCount) {
        ThreadFactory customThreadfactory = new CustomThreadFactoryBuilder().setNamePrefix("MultiThreadExecutor-Calls")
                        .setDaemon(false).build();
        ExecutorService executor = Executors.newFixedThreadPool(threadCount, customThreadfactory);
        try {
            List<Future<ResponseTask>> threadResponse = executor.invokeAll(callables);
            return getResponse(threadResponse);
        } catch (InterruptedException e) {
            // Restore interrupted state...
            Thread.currentThread().interrupt();
        } finally {
            executor.shutdown();
        }
        return Collections.emptyList();
    }

getResponse

public <T extends ResponseTask> List<T> getResponse(List<Future<ResponseTask>> threadResponse) {
        List<BSLocateUserResponse> locateResponse = new ArrayList<>();
        List<LoginUser> userResponse = new ArrayList<>();
        for (Future<ResponseTask> response : threadResponse) {
            ResponseTask result = null;
            try {
                result = response.get();
            } catch (ExecutionException e) {
                // Todo Need to capture the specific exception to ignore here
                LOG.info("Exception : {}  occurred when calling multithread ", e.getMessage());
                continue;
            } catch (InterruptedException e) {
                // Restore interrupted state...
                Thread.currentThread().interrupt();
            }
            if (result instanceof BSLocateUserResponse) {
                locateResponse.add((BSLocateUserResponse) result);
            } else if (result instanceof LoginUser) {
                userResponse.add((LoginUser) result);
            }
        }
        if (locateResponse.isEmpty()) {
            return (List<T>) userResponse;
        }
        return (List<T>) locateResponse;
    }
© www.soinside.com 2019 - 2024. All rights reserved.