Как прервать функцию приостановки Kotlin в сопрограммах и начать все сначала

#java #kotlin #kotlin-coroutines

Вопрос:

короче говоря, у меня запущен проект java/kotlin, и я ищу способ отменить функцию приостановки kotlin и запустить сопрограмму заново, если обстоятельства изменятся. в моем коде у меня могло бы быть 100 игроков ( сопрограмм), работающих одновременно с функциями приостановки и т. Д., И Ежечасно или каждый раз, когда Java вызывает некоторых из этих игроков. когда это произойдет, мне понадобится сопрограмма, чтобы остановить эту функцию приостановки и снова запустить сопрограмму. код выглядит так, как показано ниже:

 internal suspend fun update() {
    doesCoolStuff()
    goesSomewhere()
    delay 20sec
    GoesSomewhereElse()
    delay 60sec
    GoesSomewhereElsex2()
    delay 100sec
    }

private suspend fun GoesSomewhereElse() {
doesThings()
delay 2 mins
}
 

и т.д. Моя проблема в том, что когда java вызывает плеер, который находится внутри функции suspend с задержкой, он выполняет действие из java, а затем стоит и ждет, пока закончится задержка, прежде чем начать делать CoolStuff, который находится в начале сопрограммы.
так что в принципе мне нужно что-то, чтобы прервать функцию приостановки и отменить все задержки и запустить сопрограмму заново. например, функция «возврат», которую можно использовать в сопрограмме, чтобы вернуться к началу и начать все сначала только с Java.

ПРАВКА: когда придет время и Java вызовет плеер. он делает еще пару вещей, таких как телепортирует игрока, меняет имя, добавляет его в команду событий. и если этот игрок в то время что-то делает, все в порядке, он сбрасывает курс, начиная с самого начала, когда у меня есть игрок if, если он что-то делает. что хорошо работает, однако, если игрок находится в середине 3-минутной задержки, он остается в силе в течение оставшегося времени этих 3 минут. прежде чем он вернется к началу сопрограммы, где он поймет, что он находится в событии и должен что-то делать.

Комментарии:

1. Нам нужно узнать больше об этом Java-плеере. Предоставляет ли это какой-либо способ прервать действие? Возможно, вы можете указать точную библиотеку или класс.

2. просто обновил дополнительную информацию, касающуюся вызова java. надеюсь, это поможет.

3. Это не отвечает на то, к чему я клоню. Позволяет ли API плеера прерывать то, что вы начали, с помощью вызова метода? Вы можете отменить сопрограмму, но если состояние игрока не согласуется с отменой, то игрок все равно будет делать все, что вы ему скажете.

Ответ №1:

Держите ссылку на Job :

 var job: Job? = null


job?.cancel()
job = coroutineScope.launch { aSuspendFunction() }


 

Комментарии:

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