Как я могу изменить этот код, чтобы избавиться от блокировки потоков? Здесь .get()
блокирует поток для получения результата из будущего. Но можно ли абсолютно избежать блокировки? Нечто подобное - один поток отправляет запросы, а другой получает ответы и реализует некоторый код. Чтобы сделать его полностью асинхронным.
Я пытался использовать CompletableFuture, но не мог этого понять.
Пытался создать метод обратного вызова, но также не увенчался успехом.
byte[] sendRequest(JSONObject jsonObject, String username, String password) throws IOException, ExecutionException, InterruptedException {
try (AsyncHttpClient client = new AsyncHttpClient()) {
String userPassword;
if (username != null && password != null) {
userPassword = username + ":" + password;
} else {
throw new NullPointerException("Нет логина и/или пароля.");
}
Future future = client.preparePost(apiUrl)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Basic " + DatatypeConverter.printBase64Binary(userPassword.getBytes()))
.setBody(jsonObject.toString().getBytes())
.execute(getHandler());
String response = (String) future.get();
return response.getBytes();
}
}
private AsyncCompletionHandler<String> getHandler() throws IOException {
return new AsyncCompletionHandler<String>() {
@Override
public String onCompleted(Response response) throws IOException {
return response.getResponseBody();
}
@Override
public void onThrowable(Throwable t) {
}
};
}
Что я ожидаю:
- Программа отправляет запрос в основной поток.
- Тогда существует своего рода обратный вызов, который ожидает ответа в
альтернативная тема.
- Тем не менее, программа продолжает работать в главном потоке - она продолжает отправлять больше запросов.
- Когда приходит ответ от сервера, обратный вызов от
альтернативный поток ловит его и обрабатывает каким-то образом, но это
не соответствует основной теме