Banyak bahasa modern mendukung kerja dengan coroutine di tingkat bahasa. Java saat ini tidak mendukung coroutine, tetapi ada harapan bahwa hal-hal dapat berubah di masa depan.
Dalam C ++ 20, direncanakan untuk memperkenalkan dukungan untuk bekerja dengan coroutine.
Menggunakan JNI kita dapat menulis coroutine dalam C ++ dan menggunakan kode Java.
Mari kita pertimbangkan coroutine asli apa yang dapat ditulis dan bagaimana menggunakannya dalam kode Java.
Generator memungkinkan Anda untuk membuat urutan nilai dari jenis tertentu, sementara nilai-nilai tersebut dihasilkan dengan malas dan sinkron.
generator<int> generate(int count) { for (int i = 0; i < count; i++) { co_yield i; } }
Generator<Integer> gen1 = Coroutine.yield(5); Generator<Float> gen2 = Coroutine.yield(1f, 5); Generator<Double> gen3 = Coroutine.yield(v -> v * 2, 1d, 5); for (int item : gen1) { System.out.println("yield value: " + item); }
Asynchronous Generator memungkinkan Anda untuk membuat urutan nilai dari jenis tertentu, sementara nilai-nilai tersebut dihasilkan dengan malas dan tidak sinkron.
async_generator<int> generate(int count) { for (int i = 0; i < count; i++) { co_await 1s; co_yield i; } }
Generator<Integer> gen1 = Coroutine.yieldAsync(5); Generator<Float> gen2 = Coroutine.yieldAsync(1f, 5); Generator<Double> gen3 = Coroutine.yieldAsync(v -> v * 2, 1d, 5); for (int item : gen1) { System.out.println("yield value: " + item); }
Tugas melakukan perhitungan asinkron, yang dilakukan dengan malas, sementara coroutine tidak dijalankan sampai tugas dimulai secara eksplisit.
Coroutine dapat digunakan sebagai aliran cahaya. Dalam hal ini, jumlah utas yang berjalan dalam sistem dapat dibatasi, misalnya, tidak lebih dari 1000. Dan coroutine dapat dijalankan sebanyak yang Anda suka.
Saat memulai coroutine, dicek apakah sudah siap. Jika tidak, maka coroutine dijeda dan OS meneruskan pawang ke sana. Pada titik ini, sepotong kode yang berguna dijalankan. Ketika coroutine siap, maka pembaruan coroutine dilakukan.
struct awaiter { bool await_ready() const { return false; } void await_resume() {} void await_suspend(std::coroutine_handle<> handler) { if (!handler.done()) { handler.resume(); } } }; co_await awaiter{};
Seperti ketika memulai utas, Anda dapat melewati Runnable atau Callable ke coroutine.
Coroutine.await(() -> { int sum = 5 + 10; }); Task<Integer> task = Coroutine.await(() -> { int sum = 5 + 10; return sum; });
Timer menghentikan sementara tugas saat ini untuk durasi yang diperlukan.
auto operator co_await(const std::chrono::system_clock::duration& duration) { return timer{duration}; } co_await 10ms;
Dapat digunakan sebagai pengganti Thread.sleep ().
Coroutine.await(10, TimeUnit.MILLISECONDS);
Coroutines juga dapat digunakan untuk menulis kode non-pemblokiran untuk bekerja dengan sistem file, jaringan, dll.
Seperti yang Anda lihat, coroutine membuat penulisan kode asinkron lebih mudah, memungkinkan beberapa bagian dari kode dieksekusi tanpa menghalangi aliran.
Coroutine yang mereka rencanakan untuk mulai di C ++ 20 akan muncul sebagai fitur bahasa murni.
Generator, tugas, dan coroutine lainnya direncanakan akan ditambahkan ke standar C ++ 23 atau yang lebih baru.
Anda dapat menulis sendiri coroutine Anda sendiri atau menggunakan perpustakaan yang sudah jadi, misalnya
cppcoro .
Compiler MVSC, Clang sudah mendukung coroutine sebagai ekstensi, dan GCC hanya pada tahap pengembangan.
Kode sumber lengkap dapat dilihat di
kode github :.