Sunday, March 29, 2009

Pooling

Beberapa bulan yang lalu saya sempat mempelajari Quartz. Quartz adalah scheduling framework yang sangat bagus di Java. Tidak hanya menyediakan timer yang bentuknya 'aneh-aneh' (saya bahkan tidak pernah berpikir akan ada aplikasi yang menggunakan scheduling yang macam-macam hehehe...), Quartz juga bisa diintegrasikan dengan EJB. Tapi ada satu konsep yang membuat saya tertarik saat mempelajari Quartz (walaupun sebenarnya konsep ini sudah lama ada, namun sebelumnya saya tidak begitu perhatian), yaitu pooling.

Apakah itu pooling? Menggunakan bahasa saya sendiri pooling berarti berbagi resource. Resource dalam hal ini adalah instance Java. Jadi pooling berarti berbagi instance yang ada. Bagaimanakah implementasinya? Saya sempat melihat source code pooling di Quartz (ini yang paling saya suka dari open source community) dan sempat mencoba sebuah thread pool sederhana untuk menampilkan tulisan biasa ke console.

Saya mempunyai sebuah class ThreadWorker yang bertugas menampilkan tulisan ke console, dan sebuah class ThreadPool sebagai pool manager

public class MyThreadWorker extends Thread {

private Runnable runnable;
private MyThreadPool pool;
...
public MyThreadWorker(MyThreadPool pool) {
this.pool = pool;
}

public void setRunnable(Runnable runnable) {
// mengeset object runnable
}

public void run() {
// menjalankan runnable.run() dan setelah tugasnya selesai maka
// thread worker ini dikembalikan ke pool dengan memanggil pool.makeAvailable(this);
}

}

public class MyThreadPool {

// list of thread worker
private List workers;
// thread worker yang ada di pool
private LinkedList availWorkers = new LinkedList();
// thread worker yang sedang menjalankan tugas dan tidak ada di pool
private LinkedList busyWorkers = new LinkedList();

public void initialize() throws Exception {
// initialize pool dengan membuat sejumlah object thread worker
// dan memasukkannya ke list workers dan available worker
}
public boolean runInThread(Runnable runnable) {
// mengambil thread worker dari available list, memasukkan thread
// worker ke busy worker list, kemudian menjalankan thread worker
}

public void makeAvailable(Runnable runnable) {
// mengembalikan thread worker yang sudah selesai
// menjalankan tugas ke dalam pool (available worker)
}
}

Begini cara memanggilnya

public static void main(String[] args) throws Exception {
MyThreadPool pool = new MyThreadPool();
pool.initialize();
pool.runInThread(new Runnable() {...});
...
}

0 comments:

 

©2009 Stay the Same | by TNB