Middle+
Постоје ли случајеви када не можемо отказати корутине?
sobes.tech АИ
Одговор од АИ
Da, postoje.
Primeri takvih slučajeva:
- Korutina obavlja dugu računarsku operaciju bez redovnih provera za otkazivanje. Korutina proverava
isActivesamo pri pauzi (suspending). Ako zadatak ne pauzira (npr. duga petlja ili matematički proračuni), neće primetiti zahtev za otkazivanje. - Obrada izuzetaka otkazivanja se ne dešava (npr.
CancellationExceptionse ne hvata). Korutina može završiti, ali roditeljska korutina ili menadžer zadataka neće znati za njeno otkazivanje, i resursi možda neće biti pravilno oslobođeni. - Korišćenje nekooperativnih raspoređivača, kao što su
Dispatchers.Unconfinedili raspoređivač sa bazenom niti koji ne podržava Kooperativno Otkazivanje. Iako ćeCancellationExceptioni dalje biti bačen, ponašanje može biti nepredvidivo. - Korišćenje blokirajućih operacija ulaza/izlaza bez obavijanja u suspending funkcije (npr. čitanje iz
InputStreamu petlji bez korišćenjawithContext(Dispatchers.IO)i suspending metoda). Blokirajuća operacija ne proverava stanje korutine i ne bacaCancellationException.
Da bi kooperativno otkazivanje funkcionisalo, korutina mora:
- Koristiti dispatcher koji podržava
Cooperative Cancellation(npr.Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Redovno proveravati
isActiveili koristiti suspending funkcije koje to rade za nju. - Ispravno obrađivati
CancellationException.