Thread merupakan kemampuan yang disediakan oleh Java untuk membuat aplikasi
yang tangguh, karena thread dalam program memiliki fungsi dan tugas tersendiri.
Dengan adanya thread, dapat membuat program yang lebih efisien dalam hal
kecepatan maupun penggunaan sumber daya, karena kita dapat membagi proses
dalam aplikasi kita pada waktu yang sama. Thread umumnya digunakan untuk
pemrograman multitasking, networking, yang melibatkan pengaksesan ke sumber
daya secara konkuren.
Secara konkrit, konsep threads dapat dilihat ketika kita mengetik sebuah dokumen
di komputer dengan menggunakan text editor, dalam waktu yang bersamaan kita
juga dapat mendengarkan musik, dan surfing lewat internet pada PC. Sistem operasi
yang telah terinstal dalam komputer kita memperbolehkan untuk menjalankan
multitaskting. Seperti itu juga sebuah program, ia juga dapat mengeksekusi
beberapa proses secara bersama-sama (ibaratkan beberapa aplikasi berbeda yang
bekerja pada sebuah PC). Contoh aplikasi adalah HotJava browser yang
memperbolehkan untuk browsing terhadap suatu page, bersamaan dengan
mendownload object yang lain, misalnya gambar, memainkan animasi, dan juga file
audio pada saat yang bersamaan.
Sedangkan ketika kita melakukan penulisan dan pembacaan data sering kita sebut
dengan proses input dan output, dimana penulisan data berarti mengalirkan data ke
output dan menerima atau mendapatkan data dari input. Kita mengenal, dua macam
stream yaitu Stream Input dan Stream output.
Stream adalah representasi abstrak dari input dan output device, dimana aliran bytes
akan ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita
dapat membaca data dari input stream, yang dapat berupa file, keyboard atau
komputer remote. Sedangkan untuk operasi penulisan berarti menulis data pada
output stream. Package Java I/O mendukung dua tipe stream, yaitu binari dan
karakter stream. Binari merupakan data berupa bit atau data binari, sedangkan
karakter adalah tipe khusus untuk pembacaan dan penulisan teks/karakter.
Thread merupakan kemampuan yang disediakan oleh Java untuk membuat aplikasi
yang tangguh, karena thread dalam program memiliki fungsi dan tugas tersendiri.
Dengan adanya thread, dapat membuat program yang lebih efisien dalam hal
kecepatan maupun penggunaan sumber daya, karena kita dapat membagi proses
dalam aplikasi kita pada waktu yang sama. Thread umumnya digunakan untuk
pemrograman multitasking, networking, yang melibatkan pengaksesan ke sumber
daya secara konkuren. Ada dua cara yang bisa digunakan dalam membuat sebuah
thread, yaitu :
• Membuat subclass dari thread
Untuk menjalankan thread, dapat dilakukan dengan memanggil method start().
Saat start() dijalankan, maka sebenarnya method run() dari class akan
dijalankan. Jadi untuk membuat thread, harus mendefinisikan method run() pada
definisi class. Konstruktor dari cara ini adalah :
ClassThread namavar = new ClassThread();
Namavar.start();
Atau dapat juga langsung dengan cara:
New ClassThread().start();
Dalam pemrograman java ada dua threads, yaitu daemon dan user thread.
Daemon thread merupakan thread yang siklus hidupnya tergantung pada thread
utama atau induk, sehingga apabila thread induk berakhir, maka otomatis
thread-thread daemon juga ikut berakhir. Sedangkan user thread memiliki sifat
berbeda, dimana apabila thread utama sudah selesai, maka user thread akan
terus dijalankan.
1. Running
Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari
CPU.
2. Ready to run
Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada
kesempatan untuk melakukannya.
3. Resumed
Setelah sebelumnya di block atau diberhentikan sementara, state ini
kemudian siap untuk dijalankan.
4. Suspended
Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan
CPU untuk menjalankan thread lain bekerja
5. Blocked
Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu
berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah
event terjadi
Untuk menentukan thread mana yang akan menerima control dari CPU dan
akan dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas.
Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10,
dimana semakin tinggi prioritas dari sebuah thread, berarti semakin besar
kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. Sebagai
contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama.
Thread pertama akan diberikan prioritas nomor 5, sedangkan thread yang kedua
memiliki prioritas 10. Anggaplah bahwa thread pertama telah berjalan pada saat
thread kedua dijalankan. Thread kedua akan menerima control dari CPU dan
akan dieksekusi pada saat thread kedua tersebut memiliki prioritas yang lebih
tinggi dibandingkan thread yang pada saat itu tengah berjalan. Salah satu contoh
dari skenario ini adalah context switch.
Sebuah context switch terjadi apabila sebagian dari thread telah dikontrol oleh
CPU dari thread yang lain. Ada beberapa skenario mengenai bagaimana cara
kerja dari context switch. Salah satu skenario adalah sebuah thread yang sedang
berjalan memberikan kesempatan kepada CPU untuk mengontrol thread lain
sehingga ia dapat berjalan.
Dalam kasus ini, prioritas tertinggi dari thread adalah thread yang siap untuk
menerima kontrol dari CPU. Cara yang lain dari context switch adalah pada saat
sebuah thread yang sedang berjalan diambil alih oleh thread yang memiliki
prioritas tertinggi seperti yang telah dicontohkan sebelumnya. Hal ini juga
mungkin dilakukan apabila lebih dari satu CPU tersedia, sehingga lebih dari
satu prioritas thread yang siap untuk dijalankan.
Untuk menentukan diantara dua thread yang memiliki prioritas sama untuk
menerima kontrol dari CPU, sangat bergantung kepada sistem operasi yang
digunakan. Windows 95/98/NT menggunakan time-slicing dan round-robin
untuk menangani kasus ini. Setiap thread dengan prioritas yang sama akan
diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU
mengontrol thread lain yang memiliki prioritas yang sama. Sedangkan Solaris,
ia akan membiarkan sebuah thread untuk dieksekusi sampai ia menyelesaikan
tugasnya atau sampai ia secara suka rela membiarkan CPU untuk mengontrol
thread yang lain.
2. JAVA SOCKETS
a. TCP/IP
b. Sockets
c. Stream
Stream merupakan dasar operasi input-output ( I/O ) dalam Java yang
menggunakan package java.io sebagai package utama. Stream adalah
representasi abstrak dari input dan output device, dimana aliran bytes akan
ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita
dapat membaca data dari input stream, yang dapat berupa file, keyboard atau
komputer remote. Sedangkan untuk operasi penulisan berarti menulis data pada
output stream. Package java.IO mendukung dua tipe stream, yaitu binari dan
karakter stream. Binari merupakan data berupa bit atau data binari, sedangkan
karakter adalah tipe khusus untuk pembacaan dan penulisan teks/karakter.
A. Input Stream
Subclass-subclass dari input Stream adalah: Audio Input Stream, Byte Array
Input Stream, File Input Stream, Filter Input Stream, Piped Input Stream,
Sequence Input Stream, dan String Buffer Input Stream. Dua method utama
dari InputStream adalah:
a. Read : Method ini digunakan untuk membaca stream
b. Close : Method ini digunakan untuk menutup koneksi input stream.
B. Output Stream
Subclass-subclass dari outputStream adalah :
• ByteArray Output Stream : digunakan untuk menuliskan stream menjadi
byte array;
• File Output Stream : digunakan untuk menulis pada file;
• Filter Output Stream : merupakan superclass dari subclass-subclass seperti
Data Output Stream, Buffer Output Stream, Print Stream, Checked Output
Stream;
• Object Output Stream : digunakan untuk menuliskan objek pada Output
Stream.
• Piped Output Stream : digunakan untuk menjadi output dari Piped Input
Stream.
Sebagian method-method Output Stream adalah :
#Voidclose()
Menutup output stream yang aktif dan melepaskan sumber daya terkait dengan
stream tersebut;
#Void flush()
Melakukan flush output stream dan memaksa semua byte buffer untuk
dituliskan keluar;
#Void write(byte[] b)
Menulis sebanyak b.length dari byte array ke output stream;
#Void write(byte[] b, int off, int len)
Menuliskan sebanyak len byte dari byte array b dimulai dari index off.
try{
Thread.sleep(random.nextInt(200));
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.print(data);
try{
Thread.sleep(random.nextInt(200));
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("]");
}
}
class ThreadBaru extends Thread {
private String data;
private TestSinkronisasi obj;
public ThreadBaru(TestSinkronisasi obj,String data) {
this.obj = obj;
this.data = data;
start();
}
public void run() {
obj.callMe(data);
}
}
class DemoThread {
public static void main(String[] args) {
TestSinkronisasi obj = new TestSinkronisasi();
ThreadBaru thread1 = new ThreadBaru(obj,"Superman");
ThreadBaru thread2 = new ThreadBaru(obj,"Batman");
ThreadBaru thread3 = new ThreadBaru(obj,"Spiderman");
//tunggu hingga semua child thread selesai dieksekusi
try{
thread1.join();
thread2.join();
thread3.join();
}catch(InterruptedException e) {
System.out.println("Thread utama diinterupsi " + e);
}
}
}
3. RMI
a. Arsitektur RMI
Untuk membuat sebuah kelas yang method-method-nya dapat diakses secara
remote, pertama-tama kita harus membuat sebuah interface, di mana interface-
interface ini harus mendeklarasikan method-method tersebut. Sementara untuk
pengiriman dan penerimaan data sudah pun ditangani secara otomatis oleh
objek stream. Kelas ini nantinya harus mengimplementasikan interface tersebut.
Stub dan skeleton adalah objek yang berfungsi untuk
melakukan proses pengiriman dan penerimaan data dari suatu aplikasi RMI.
Skeleton adalah sebuah kelas yang merupakan pasangan dari kelas stub yang
berada pada mesin yang sama dengan objek remote. Kelas ini juga yang akan
menerima koneksi dari kelas stub dan menerjemahkannya ke dalam
pemanggilan method pada objek remote. Untuk lebih jelasnya mengenai proses
ini ditunjukkan oleh Gambar 2.
a. Objek Remote
Objek remote ini sendiri dapat dikategorikan menjadi dua bagian, yaitu:
• Interface yang menggambarkan tentang method dari objek ini yang
dapat dipanggil secara remote.
• Objek yang mengimplementasikan interface tersebut.
b. Stub dan Skeleton
Fungsi utama dari kedua kelas ini adalah untuk melakukan pengiriman dan
penerimaan data baik di sisi server dan di sisi client.
c. Penyusunan dan Pengiriman Data
Baik kelas stub maupun kelas skeleton akan melakukan hal-hal yang
berhubungan dengan komunikasi RMI secara otomatis. Sehingga kita tidak
akan direpotkan lagi dalam hal pengiriman data dari dan ke server ataupun
client.
d. Remote Exception
RemoteException merupakan kelas induk dari segala macam kegagalan atau
eksepsi yang dapat terjadi pada aplikasi RMI. Eksepsi ini akan dilemparkan
jika pemanggilan terhadap method remote gagal. Semua method yang
terdapat pada interface remote harus melemparkan eksepsi ini.
e. Mekanisme Naming
Client hanya bisa menggunakan atau meminta method pada objek remote
jika client telah memiliki referensi ke objek tersebut. Client akan melakukan
koneksi ke registry dan mendapatkan lokasi objek remote berdasarkan
namanya. Untuk proses penentuan lokasi ataupun objek remote oleh client
ditunjukkan oleh Gambar 4.
Gambar 4.
Menentukan alamat objek remote dengan layanan Naming