Memanfaatkan ConcurrentLinkedQueue sebagai Manajeman Tugas yang Multithreaded


Membangun sistem yang multithreaded tidaklah mudah, banyak sekali yang harus diperhatikan, seperti syncronisasi resource yang digunakan antar thread sampai jangan sampai terjadi deadlock pada sistem yang dibangun. Contohnya jika kita membangun sebuah sistem berbasis client-server, maka otomatis server harus dapat menangani permintaan client yang terjadi secara bersamaan.

Misal ada sebuah Bank, bank tersebut tidak melakukan sistem antrian untuk nasabah yang datang ke Bank tersebut, sehingga nasabah dapat seenaknya datang ke teller. Bisa dibayangkan apa yang akan terjadi saat teller hanya ada 5 dan nasabah sekaligus datang sebanyak 50 orang, maka bisa dipastikan teller akan kewalahan menanganinya, bahkan bisa jadi teller salah melakukan pelayanan.

Namun berbeda jika Bank tersebut menggunakan sistem antrian, maka otomatis dengan begitu, satu teller akan menangani satu nasabah. Bahkan walaupun pada Bank tersebut hanya ada satu teller, maka jika yang datang ada 100, maka teller tersebut tetap dapat menanganinya karena adanya sistem antrian, sehingga hanya satu nasabah yang dapat datang ke teller, dan nasabah yang lainnya harus menunggu sampai nasabah yang berada didepannya selesai bertransaksi dengan teller.

Sekarang kembali ke topik…

Misal kita membangun sebuah sistem berbasiskan client-server, dimana terdapat sebuah server dan banyak client. Client dapat melakukan permintaan ke server, permintaan tersebut bisa berupa request data atau perintah menjalankan tugas. Request dari client bisa datang kapan saja, sehingga bisa saja pada saat yang bersamaan beberapa client melakukan request ke server. Jika kita tidak menggunakan sistem antrian, maka kejadian pada Bank sebelum menggunakan proses antrian dapat terjadi. Dengan begitu perlu dilakukan sistem antrian pada sistem server, sehingga proses request dari client dapat dieksekusi satu per satu oleh server.

Dalam java, struktur data antrian adalah Queue, namun Queue tidaklah thread safe. Karena sistem yang dibangun berbasiskan miltithread, maka kita dapat menggunakan ConcurrentLinkedQueue, yang merupakan Queue thread safe.

package khannedy.learning.queue;

import java.util.concurrent.ConcurrentLinkedQueue;

public class Server implements Runnable {

	private ConcurrentLinkedQueue<Tugas> queue = new ConcurrentLinkedQueue<Tugas>();
	private Thread thread;

	public Server() {
		thread = new Thread(this);
	}

	public void tambahTugas(Tugas tugas) {
		queue.offer(tugas);
	}

	public void startServer() {
		thread.start();
	}

	public void stopServer() {
		thread.interrupt();
	}

	@Override
	public void run() {
		while (!thread.isInterrupted()) {
			Tugas tugas = queue.poll();
			if (tugas != null) {
				// eksekusi tugas...
			}
		}
	}

}

Kode diatas adalah contoh sederhana dari sistem server, metode startServer() digunakan untuk menjalankan server, metode stopServer() digunakan untuk menghentikan server dan metode tambahTugas(Tugas) digunakan untuk menambah tugas, metode tambahTugas(Tugas) digunakan oleh client untuk menambahkan tugas ke server.

Iklan

6 pemikiran pada “Memanfaatkan ConcurrentLinkedQueue sebagai Manajeman Tugas yang Multithreaded

  1. Mantap mas artikelnya, tapi saya masih belum paham beberapa hal mengenai multithread ini. Saya mau tanya beberapa hal, kalo berkenan dijawab ya mas. Sorry mas isi link rujukan di atas terlalu berat kayaknya, apa lagi bahasanya inggris :D, jadi saya tanya langsung aja ya.

    1. saya punya prosessor cuma 1 core saja apa bisa digunakan untuk multithread, kalo bisa prosesnya seperti apa ?
    2. Jenis multithread program di atas apakah Synchronized atau Asynchronized threads ?
    3. kode : Tugas tugas = queue.poll(); tipe data dari method poll() apakah sama dengan Tugas ? kalo sama dari mana ya ?
    4. Untuk menjalankan thread kan harus melalui thread.start(), nah apakah method startServer() harus dipanggil dari perulangan while (!thread.isInterrupted())
    5. Jika thread dihentikan, apakah Garbage Collector akan otomatis membersihkan memori yang terpakai ?

    maaf mas baru belajar multithread nih jadi banyak pertanyaan :D, kalo bisa dijawab satu per satu ya mas, ditunggu nih. Trims..

  2. 1. Multithreaded itu artinya, pada saat yang bersamaan kita dapat menjalankan beberapapa thread (proses), walaupun singlecore, tetep dapat menjalankan multithreaded, contohnya kita dapat membuat microsoft world sambil menjalankan musik menggunakan winamp, artinya itu sudah multithreaded.

    2. Synchronized artinya ketika proses di server berjalan, maka client harus menunggu sampai proses itu selesai. Asynchronized artinya ketika proses bejalan, client dapat melakukan proses lain tanpa harus menunggu proses di server. Pada kode diatas saya menggunakan Asynchronized. Contoh Synchronized itu ketika kita melakukan transfer menggunakan ATM, maka kita harus menunggu dulu sampai proses transfer selesai, kita tidak bisa mengirim menggunakan ATM dimana pada saat mengtrasfer kita menarik uang. Kita harus menunggu proses transfer selesai, baru menarik uang.

    3. Kita dapat langsung menentukan pada saat queue.pool() hasilnya adalah Tugas, hal ini karena pada saat pendeklarasian queue, kita sudah membuat kelas generik untuk Tugas.

    4. Metode start() milik Thread, hanya dipanggil sekali ketika thread akan dijalankan.

    5. Tergantung, jika objek direference oleh objek lainnya, maka tidak akan dihapus dari memori, namun jika objek tidak ada yang mereference lagi, maka otomatis akan dihapus.

    Link yang berguna :
    http://download.oracle.com/javase/tutorial/extra/generics/index.html
    http://download.oracle.com/javase/6/docs/api/java/util/package-summary.html

  3. minta tolong bisa mas,… minta dibikinin source kode implementasi penggunaannya pada contoh aplikasi client-server yang ada di tutorial mas eko sebelumnya.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s