Цикл событий запускается, когда больше ничего не выполняется (например, основной метод завершен, вы ожидаете завершения в будущем).
Ваш пример имеет смысл, поскольку первая строка помещает событие в очередь событийтак что теперь первый элемент в очереди "print ('future1')". В следующей строке вы помещаете другое событие в очередь, которое вызывает «print ('future2')», и теперь вы ждете, когда это событие будет выполнено.
Поскольку основной метод не ожидает чего-то, тоцикл обработки будет выполняться. Поскольку первое событие в очереди было «print ('future1')», то это будет выполнено первым. Но так как основной метод все еще ожидает завершения "print ('future2')" в будущем, цикл обработки событий выполняет другое событие, которое будет "print ('future2')".
Так как это событие было тем, которого ожидал основной метод (и в очереди событий больше нет событий), то main () выполнит последний вызов "print ('end of main')".
В следующем примере вы думаете, что Future и Future.delayed - это то же самое, что и нет. С Future.delayed в очереди событий не происходит никаких событий. Вместо этого за пределами виртуальной машины запущен поток, который знает, когда должен сработать следующий таймер, что в итоге приводит к тому, что событие помещается в очередь. Таким образом, событие помещается в очередь событий только после истечения таймера (и, следовательно, future2 будет выполняться первым).