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

Resource untuk Belajar JavaSE, JavaEE, JavaDB, JavaME, JavaFX


Kadang suka banyak yang chating menanyakan resource untuk belajar Java, baik itu java desktop, java web dan lain-lain. Supaya gampang nanti ngasih link resourcenya, saya gabungkan saja diartikel ini :

  1. Java Standard Edition : http://download.oracle.com/javase/
  2. Java Enterprise Edition : http://download.oracle.com/javaee/
  3. Java Database : http://download.oracle.com/javadb/
  4. Java Micro Edition : http://download.oracle.com/javame/
  5. JavaFX : http://download.oracle.com/javafx/

Silahkan belajar….

Insert Data Dengan ResultSet


Biasanya ResultSet digunakan untuk meload data hasil query, tapi tahukan bahwa ResultSet juga dapat digunakan untuk menambah data ke dalam database, sehingga kita tidak perlu lagi menggunakan perintah INSERT INTO BLA BLA BLA

Connection connection = DatabaseUtilities.createConnection();

Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet resultSet = statement.executeQuery("SELECT * FROM mahasiswa");

Saat createStatement diatas, kita menggunakan parameter ResultSet.TYPE_SCROLL_INSENSITIVE dan ResultSet.CONCUR_UPDATEABLE, TYPE_SCROLL_INSENSITIVE artinya bahwa result set yang akan kita buat tidak sensitive terhadap perubahan yang terjadi pada result set, sedangkan CONCUR_UPDATEABLE artinya bahwa result set yang kita buat dapat melakukan proses pengubahan data (dimana disini kita akan melakukan penambahan data).

resultSet.moveToInsertRow();
resultSet.updateString("nim", "10106033");
resultSet.updateString("nama_depan", "Eko Kurniawan");
resultSet.updateString("nama_belakang", "Khannedy");
resultSet.updateDate("tanggal_lahir",
new Date(System.currentTimeMillis()));
resultSet.insertRow();

Untuk menambah data sebuah baris, maka kita menggunakan metode moveToInsertRow() milik ResultSet. Setelah itu maka kita perlu menambahkan data-data tiap kolomnya, dimana pada kode diatas saya menambahkan data kolom nim, nama_depan, nama_belakang dan tanggal_lahir.

Jika proses penambahan data tiap kolomnya telah selesai, maka untuk menyimpan perubahan kita perlu memanggil mettode insertRow(). Dan setelah itu, otomatis data yang kita tambahkan akan masuk ke database tanpa menggunakan perintah INSERT INTO BLA BLA BLA

Full code :

Connection connection = DatabaseUtilities.createConnection();

Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

ResultSet resultSet = statement.executeQuery("SELECT * FROM mahasiswa");

resultSet.moveToInsertRow();
resultSet.updateString("nim", "10106033");
resultSet.updateString("nama_depan", "Eko Kurniawan");
resultSet.updateString("nama_belakang", "Khannedy");
resultSet.updateDate("tanggal_lahir",
new Date(System.currentTimeMillis()));
resultSet.insertRow();

resultSet.close();
statement.close();
connection.close();

Undangan Talkshow Bandung Student CodeCamp 2010


Java User Grup Bandung (JUG-Bandung) bersama-sama dengan Open Source University Meetup (OSUM) bersama-sama mengadakan Bandung Student Codecamp pada 20-22 September 2010, sebuah acara mahasiswa informatika
dari berbagai universitas akan dikumpulkan bersama-sama selama 3 hari 2 malam untuk bekerja bersama dalam membuat program impian mereka.

Sebagai bagian dari acara Bandung Student Codecamp, akan dilaksanakan berbagai macam talkshow dengan berbicara dari berbagai kalangan, yaitu :

“Managing and Working in a developer team”
Membahas bagaimana cara mengelola dan bekerja bersama dalam sebuah team pengembang perangkat lunak. Pembicara dalam sesi ini akan adalah beberapa perusahaan yang berpengalaman dalam mengelola berbagai macam
team developer yaitu Sangkuriang , Agate Studio, Digital Mark Reader.
Waktu : Senin 20 September, 20.00 – 22.00

“Create your own IT Startup”
Membahas bagaimana cara membuat dan mengembangkan perusahaan IT sendiri dengan semangat entrepeneur. Pembicara dalam sesi ini adalah beberapa perusahaan startup IT yaitu Javan IT Solutions, StarqleIndonesia, serta Gagas Imaji.
Waktu : Selasa 21 September, 20.00 – 22.00

“Using the community to go forward together”
Membahas bagaimana bekerja sama dan memberdayakan komunitas-komunitas IT yang ada di Indonesia dengan pembicara adalah Alex Budiyanto, Community Manager Sun Oracle Indonesia
Waktu : Rabu 22 September , 08.00 – 10.00

Dan satu sharing spesial dengan pembicara Harry Kaligis, pimpinan Sun Oracle Indonesia.
Waktu : Selasa 22 September, 14.00 – 15.00

Lokasi dari acara adalah Wisma Wirabuana, jalan Gandapura no 31 Bandung (Di antara jalan Riau dan jalan Ahmad Yani). Semua acara talkshow dan sharing terbuka untuk umum dan tidak dipungut biaya (GRATIS). Untuk mengikuti acara, cukup datang langsung ke lokasi setengah jam sebelum talkshow dimulai.

Contact Person :
– Eko Kurniawan Khannedy (085292775999) (UNIKOM)
– Frendy (08562021302) (UPI)

Memfilter Collection


Pernah memfilter sebuah collection ? Misal kita punya collection yang berisikan data Mahasiswa, setelah itu kita mau mengambil seluruh mahasiswa yang berjenis kelamin Perempuan. Jika menggunakan database, sangat mudah, tinggal SELECT * FROM MAHASISWA WHERE JENIS_KELAMIN = 'PEREMPUAN' Tapi bagaimana jika dalam collection?

Gampang aja, tinggal telusuri collection tersebut satu persatu menggunakan perulangan, setelah itu cek setiap recordnya, jika berjenis kelamin perempuan, maka ambil data itu 😀 Gitu aja kok repot….

Yup, memang, saat ini kita mau menggunakan cara yang merepotkan 😀

Pertama kita buat sebuah interface Filter, interface ini nanti digunakan untuk melakukan pengecekah apakah data diterima atau tidak :


package khannedy.blogging.collection;

public interface Filter<T> {

	boolean include(T data);

}

Setelah itu kita buat sebuah kelas CollectionUtil, kelas ini yang nanti digunakan sebagai kelas utilitas yang melakukan proses filtering menggunakan interface Filter sebelumnya yang telah dibuat.


package khannedy.blogging.collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class CollectionUtil {

	public static <T> Collection<T> filter(Collection<T> source, Filter<T> filter) {
		List<T> list = new ArrayList<T>();

		for (T data : source) {
			if (filter.include(data)) {
				list.add(data);
			}
		}

		return list;
	}

}

Dengan demikian, sekarang jika kita akan memfilter data sebuah Collection, tinggal menggunakan perintah :


List<Mahasiswa> list = new ArrayList<Mahasiswa>();

Collection<Mahasiswa> hasil = CollectionUtil.<Mahasiswa> filter(list, new Filter<Mahasiswa>() {

	@Override
	public boolean include(Mahasiswa data) {
		if (data.getJenisKelamin().equals("Perempuan")) {
			return true;
		} else {
			return false;
		}
	}
});

Haha, kalo ada yang ribet kenapa mesti yang mudah? Silahkan anda pikirkan sendiri kenapa saya menggunakan cara coding seperti ini 😀