powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронный метод
17 сообщений из 17, страница 1 из 1
Асинхронный метод
    #39687169
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызывается асинхронный, рекурсивный метод
Как можно дождаться его завершения, а потом завершить, сам метод , который его вызывает

Без Rx и Compleatble Feature



Пробую Concurrent Lock , Thread joinПока не выходит
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687173
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,

Ну как обычно,событийно например callbackom
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public interface Callback {

        public void onAsinhResult(boolean resultIsYes);
    }

 Callback callback=(new Callback(){
			 public void onAsinhResult(boolean resultIsYes)
			 {
				// System.out.println("ACEPPT"); 
				
				//Делаем тут что нужно
			 }
			 });

AsinhMethod asinh=new AsinhMethod(callback);
asinh.run();

//И когда run закончится там callback.onAsinhResult(is_confimed);
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687189
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
    new Runnable() {
      @Override
      public void run() {
        delete(fsWrapper, Path.getROOT());
      }
    }.run();



Просто проходит дальше и все
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687193
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как в случае CompletableFuture мне дождаться callBack?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  public CompletableFuture<File> createFile(Path path, String content) {
    CompletableFuture<File> completableFuture = CompletableFuture.supplyAsync(new Supplier<File>() {
      @Override
      public File get() {
        asyncFileSystem.createFile(path, content, new Function<Result<File>, Object>() {
          @Override
          public Object invoke(Result<File> fileResult) {
            File file = fileResult.getData();
            return null;
          }
        });
        return null;
      }
    });
    return completableFuture;
  }
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687197
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть по сути как обернуть

Код: java
1.
2.
3.
4.
5.
6.
7.
asyncFileSystem.createFile(path, content, new Function<Result<File>, Object>() {
          @Override
          public Object invoke(Result<File> fileResult) {
            File file = fileResult.getData();
            return null;
          }
        });



В CompletableFuture
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687207
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-,
Асинхронно пишут чтобы Не дожидаться и не ждать.
Опиши постановку грамотнее.
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687220
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-А как в случае CompletableFuture мне дождаться callBack?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  public CompletableFuture<File> createFile(Path path, String content) {
    CompletableFuture<File> completableFuture = CompletableFuture.supplyAsync(new Supplier<File>() {
      @Override
      public File get() {
        asyncFileSystem.createFile(path, content, new Function<Result<File>, Object>() {
          @Override
          public Object invoke(Result<File> fileResult) {
            File file = fileResult.getData();
            return null;
          }
        });
        return null;
      }
    });
    return completableFuture;
  }



Надо изучать класс CompletableFuture Возможно он имеет нужное событие.
А не найдете событие,то в принципе зачем Вам он ..Обычным java способом,что уже файлы никто не читает..надо какие то обертки включать.
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687237
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123-=Koba=-,
Асинхронно пишут чтобы Не дожидаться и не ждать.
Опиши постановку грамотнее.

Есть небольшое тестовое задание

Kotlin
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
interface AsyncFileSystem {
    fun createFile(path: Path, content: FileContent, onResult: (Result<File>) -> Unit)
}

class AsyncFileSystemImpl(
    private val fs: KotlinFileSystem
) : AsyncFileSystem {

    override fun createFile(path: Path, content: FileContent, onResult: (Result<File>) -> Unit) =
        handleResult(onResult) {
            fs.createFile(path, content)
        }

    private fun <T> handleResult(onResult: (Result<T>) -> Unit, block: suspend () -> T) {
        launch(Unconfined) {
            val result: T = try {
                block()
            } catch (e: FsException) {
                onResult(Result.ofError(e))
                return@launch
            }
            onResult(Result.of(result))
        }
    }
}




Пишу тест на Java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    log.info("START = " + pathRoot.getName());
    ...
    targetFsWrapper.createFile(pathRoot, ((File) fileSystemItem).getContent(), fileResult -> {
      fileResult.getData();
      return null;
    });
    ...
    log.info("FINISH = " + pathRoot.getName());



В итоге у меня выводятся два лога и валится по ассерту
Собственно вопрос как в случае теста, сделать последовательное выполнение методов
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687332
qasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=Koba=-,

Обычно асинхронные методы возвращают Future<X>.
Чтобы дождаться выполнения асинхронной таски - в этом интерфейсе есть методы get(...)
Как с таймаутами разными, так и "навечно блокирующийся".

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#get--

авторpublic T get()
throws InterruptedException,
ExecutionException
Waits if necessary for this future to complete, and then returns its result.


Так что вызывайте на объекте, который вам вернулся из asyncFileSystem.createFile (там, как я понимаю, как раз Future<...>) метод get(), а после этого - вызывайте ваш колбек и т.п.

Но постановка задачи странная - зачем вам блокировать основной поток выполнения?
В принципе, вы могли бы воспользоваться методом thenRun

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#thenRun-java.lang.Runnable-

авторpublic CompletableFuture<Void> thenRun(Runnable action)

Description copied from interface: CompletionStage
Returns a new CompletionStage that, when this stage completes normally, executes the given action. See the CompletionStage documentation for rules covering exceptional completion.

и вызывать ваш callback в этом Runnable action.
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687474
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  private void delete(AsyncFileSystem fsWrapper, Path pathRoot) {
    log.info("START = " + pathRoot.getName());
    fsWrapper.getChildren(pathRoot, listResult -> {
      if (listResult.isOk()) {
        listResult.asSuccess().getData().forEach(name -> {
          log.info("Children = " + name);
        });
      }
      return null;
    });
    log.info("FINISH = " + pathRoot.getName());
  }



Код: java
1.
2.
3.
4.
216 [main] INFO by.single.SingleAsyncDeleteStrategy - START = /
217 [main] INFO by.single.SingleAsyncDeleteStrategy - FINISH = /
217 [main] INFO by.single.SingleAsyncDeleteStrategy - SingleAsyncDeleteStrategy = PT0.001S
218 [kotlinx.coroutines.DefaultExecutor @coroutine#362] INFO by.single.SingleAsyncDeleteStrategy - Children = a



Сейчас дела обстоят так
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687501
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грубо говоря, мне надо асинхронный код вызвать синхронно...
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687674
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-Грубо говоря, мне надо асинхронный код вызвать синхронно...
Ты хочешь протестировать, что метод работает правильно, так? Не то что он работает асинхронно или синхронно, а правильно. Ну так выдели этот метод в отдельный класс, где он выполняется синхронно и тестируй этот класс. А потом используй его в асинхронном коде.
Нет, ну можно конечно поиграться с Future или банальным wait/notify но просто чтоб не получилось так, что ты встраиваешь в класс некий функционал в виде коллбэков, future и т.д. только потому что его тестировать надо, а так они там нафиг не нужны.
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687675
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P. S. а если ты хочешь протестировать, что метод не просто правильно работает, но еще и thread safe, ну так напиши мультипоточный тест - но только логику выполнения/ожидания потоков реализуй прямо в нем, а не в исходном классе.
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687762
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687765
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Baz baz = Single.create(new SingleOnSubscribe<Baz>() {
                @Override
                public void subscribe(SingleEmitter<Baz> emitter) {
                    doSomethingAsync(fooArg, barArg, new BazComputationSink() {
                        @Override
                        public void onBazResult(Baz result) {
                            emitter.onSuccess(result);
                        }
                    });
                }
            }).toFuture().get();



С RxJava нашел как длеать
А как как преобразовывать async методеы в CompletableFuture нет =(
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687773
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-Вызывается асинхронный, рекурсивный метод
Как можно дождаться его завершения, а потом завершить, сам метод , который его вызывает

Без ... Compleatble Feature



Пробую Concurrent Lock , Thread joinПока не выходит
я так думаю, хотят проверить на использование join().
Вот первая попавшаяся ссылка - https://www.avajava.com/tutorials/lessons/how-do-i-use-threads-join-method.html
...
Рейтинг: 0 / 0
Асинхронный метод
    #39687923
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим я уже разобрался теперь мне надо

Асинхронный метод обернуть в CompleatbleFeature

Код: java
1.
2.
3.
4.
5.
6.
    fs.getChild(path, (Function1<Result<List<String>>, Unit>) listResult -> {
      if (listResult.isOk()){
        listResult.asSuccess().getData(); //RESULT
      }
      return null;
    });
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Асинхронный метод
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]