- Pengertian Concurrency
Concurrency merupakan landasan umum perancangan sistem operasi. Proses-proses disebut concurrency jika proses-proses (lebih dari satu proses) berada pada saat yang sama. Proses-proses yang mengalami kongkuren dapat berdiri sendiri (independen) atau dapat saling berinteraksi, sehingga membutuhkan sinkronisasi atau koordinasi proses yang baik. Untuk penanganan kongkuren, bahasa pemograman saat ini telah memiliki mekanisme kongkurensi dimana dalam penerapannya perlu dukungan sistem operasi dimana bahasa berada.
Dalam menjalankan suatu program, ada beberapa hal yang harus diperhatikan yaitu:
- Program: file yang dieksekusi
- Proses: dalam menjalankan suatu program, pasti ada proses
- Thread: proses ringan, semua proses pasti memiliki thread dan semua thread yang berhubungan dengan proses umum pasti memiliki memory umum.
- Task: mirip dengan thread tapi tidak berhubungan langsung dengan operating system dan tidak membuat thread operating system sendiri.
Terdapat berbagai tingkatan level yaitu:
- Instruction level:eksekusi dua atau lebih mesin instruksi secara bersamaan
- Statement level: eksekusi dua atau lebih statement secara bersamaan
- (Subprogram) Unit level: eksekusi dua atau lebih subprogram secara bersamaan
- Program level: eksekusi dua atau lebih program secara bersamaan
Terdapat dua jenis concurrency dalam unit control, yaitu:
- Physical concurreny:anggapan bahwa ada lebih dari satu processor sehingga beberapa sub program dijalankan bersamaan.
- Logical concurrency:anggapan bahwa ada banyak processor yang menyediakan concurrency, yang pada kenyataannya hanya terdapat satu processor yang interleaved saat program dieksekusi
Karena concurrency dapat menjalankan lebih dari satu program maka synconisasi dibutuhkan untuk menjalankan proses dengan baik. Sinkronisasi merupakan suatu mekanisme yang bertujuan unutk mengatur urutan-urutan task yang akan dieksekusi.
Task merupakan unit program yang dapat dieksekusi bersamaan dengan unit lain dalam suatu program.terdapat dua jenis umum task dalam suatu program yaitu:
- Heavyweight tasks yang dapat dieksekusi dalam addressnya masing-masing.
- Dan lightweight task yang dapat dieksekusi dalam address yang sama.
Task dapat dikatakan disjoint apabila task tersebut tidak dapat berhubungan dengan task yang lain dalam suatu program.
Sinkronisasi dapat dibagi menjadi dua jenis yaitu:
- Competitive synchronitation dimana dalam suatu program terdapat dua atau lebih task yang harus menggunakan resource yang tidak dapat digunakan berulang-ulang kali.
- Cooperation synchronitation dimana task A harus menunggu task B untuk menyelesaikan suatu tugas sehingga task A dapat melanjutkan eksekusinya.
Untuk dapat mengatur urutan-urutan task dalam suatu program maka sinkronisasi harus dapat menghentikan sementara task-task tersebut. Biarpun suatu mesin mempunyai satu atau lebih processor, pasti ada kemungkin dimana task melebihi processor dan dalam sebuah runtime tersebut maka pasti ada scheduler untuk mengatur task-task tersebut.
Keadaan task:
- New: telah dibuat tetapi belum berjalan.
- Ready: siap untuk dijalankan tetapi belum dijalankan. Baik task belum diberi processor atau sudah berjalan tetapi diblock
- Running: task sudah berjalan
- Blocked: task sudah berjalan tetapi tidak dapat melanjutkan. Biasanya menunggu suatu event.
- Dead: task sudah mengerjakan tugasnya atau dipaksa berhenti oleh program
Dalam menjalankan suatu program task memiliki karakteristik dimana program tersebut terus berjalan hingga selesai,Karakteristik tersebut disebut liveness.Jika ada kondisi dimana program berjalan,pasti ada kondisi dimana program tersebut berhenti dikarenakan diblock atau dipaksa olah program untuk berhenti.Kondisi tersebut disebut deadlock.
Ada berbagai unutk melakukan sinkronisasi yaitu:
- Semaphores
- Monitors
- Message Passing
- Concurrency dalam Java
Java adalah bahasa pemrograman banyak thread, yang artinya beberapa hal bisa dilakukan bersama-sama. Thread adalah unit terkecil dari eksekusi suatu program. Thread mengeksekusi rangkaian instruksi satu demi satu. Ketika sistem menjalankan program, komputer akan membuat thread baru. (Thread dalam konteks ini disebut proses, akan tetapi perbedaanya tidank penting di sini). Instruksi-instruksi dalam program akan dieksekusi oleh thread ini secara berantai, satu demi satu dari awal hingga akhir. Thread disebut “mati” jika program selesai dieksekusi.
Java bisa membuat satu atau lebih thread yang bisa dijalankan secara paralel. Hal ini adalah bagian mendasar, yang dibuat di dalam core bahasa, bukan merupakan tambahan (add-on) seperti bahasa pemrograman lain. Tetap saja pemrogaman dengan banyak thread adalah sesuatu yang tidak mudah.
- Pembuatan Thread
Ada dua cara yang dapat digunakan untuk membuat sebuah thread baru. Yang pertama adalah dengan membuat sebuah objek thread dengan menyertakan sebuah objek yang mengimplementasikan interface Runnable.
Yang kedua dengan membuat sebuah objek yang diturunkan dari sebuah class yaitu Thread
- Pause Thread
Sebuah thread dapat diberhentikan sementara. Salah satu cara yang dapat digunakan adalah dengan menggunakan method sleep() yang dimiliki oleh objek thread. Melalui method ini anda dapat memberhentikan sebuah thread selama selang waktu tertentu.
- Interrupt Thread
Interrupt menunjukkan bahwa sebuah thread harus berhenti melakukan apa yang sedang dikerjakan dan melakukan pekerjaan lainnya. Anda dapat menentukan apa yang akan dikerjakan sebuah thread jika ia di interrupt.
- Join Thread
Method join() pada objek thread memungkinkan sebuah thread untuk berhenti sementara hingga thread yang ia join telah selesai dieksekusi.