Pada sub-modul sebelumnya kita sudah mencoba menggunakan fungsi runBlocking dan launch untuk memulai sebuah coroutines. Kedua fungsi tersebut merupakan coroutines builder, yaitu sebuah fungsi yang mengambil suspending lambda dan membuat coroutine untuk menjalankannya.
Kotlin menyediakan beberapa coroutine builder yang bisa disesuaikan dengan berbagai macam skenario, seperti:
Sekarang giliran kita untuk mencoba contoh penerapan coroutine dengan async. Bayangkan jika kita memiliki 2 (dua) suspending function seperti berikut:
1. suspend fun getCapital(): Int { 2. delay(1000L) 3. return 50000 4. } 5. 6. suspend fun getIncome(): Int { 7. delay(1000L) 8. return 75000 9. }
Anggap saja bahwa delay pada kedua fungsi tersebut adalah waktu yang dibutuhkan untuk melakukan operasi sebelum hasilnya didapatkan. Selanjutnya kita ingin memanfaatkan keduanya, misalnya untuk menghitung keuntungan seperti berikut:
1. import kotlinx.coroutines.* 2. 3. fun main() = runBlocking { 4. val capital = getCapital() 5. val income = getIncome() 6. println("Your profit is ${income - capital}") 7. }
Pada kode di atas, kita menggunakan pendekatan sequential. Kenapa? Pada dasarnya kode di dalam coroutines juga dijalankan secara berurutan seperti kode normal lain. Dalam praktiknya kita melakukan ini jika kita menggunakan hasil dari fungsi pertama untuk membuat keputusan apakah kita perlu memanggil fungsi kedua.
Bagaimana jika tidak ada ketergantungan antara fungsi getCapital dan getIncome dan kita ingin menjalankan keduanya secara bersamaan? Di sinilah async dibutuhkan. Kita bisa menuliskan kode seperti berikut:
1. import kotlinx.coroutines.* 2. 3. fun main() = runBlocking { 4. val capital = async { getCapital() } 5. val income = async { getIncome() } 6. println("Your profit is ${income.await() - capital.await()}") 7. }
Dengan kode tersebut, kita telah memanggil fungsi getCapital dan getIncome di dalam async.Maka async akan mengembalikan hasil dari masing-masing fungsi. Lalu untuk mengakses hasil tersebut, kita perlu menggunakan fungsi await.
Wait.. adakah perbedaan dengan kode sebelumnya? Dengan async seolah-olah kedua fungsi tersebut berjalan bersamaan dan membutuhkan waktu yang lebih singkat dari kode sebelumnya. Untuk membuktikannya, yuk coba jalankan kode berikut:
1. import kotlinx.coroutines.* 2. import kotlin.system.measureTimeMillis 3. 4. fun main() = runBlocking { 5. val timeOne = measureTimeMillis { 6. val capital = getCapital() 7. val income = getIncome() 8. println("Your profit is ${income - capital}") 9. } 10. 11. val timeTwo = measureTimeMillis { 12. val capital = async { getCapital() } 13. val income = async { getIncome() } 14. println("Your profit is ${income.await() - capital.await()}") 15. } 16. 17. println("Completed in $timeOne ms vs $timeTwo ms") 18. 19. }
Konsol akan menampilkan hasil berikut:Your profit is 25000Your profit is 25000Completed in 2013 ms vs 1025 ms
Kita bisa lihat bahwa kode yang dijalankan di dalam async bisa selesai hampir 2 kali lebih cepat dibandingkan tanpa async!