Anda di halaman 1dari 9

1.

KONKURENSI PADA JAVA


Konkuren adalah Melakukan 2 atau lebih aktivitas pada saat bersamaan
• Dalam konteks komputer, aktivitas konkuren:
– Sistem operasi mampu menjalankan beberapa program bersama-sama
– Sebuah aplikasi dapat melakukan aktivitas bersamaan: menunggu event dari user
(keyboard, mouse), melakukan penyimpanan file ke hard disk, melakukan
pencarian teks

a. Tread Pada Java


Dalam sebuah pemrograman berorientasi object seperti halnya Program Java, kita
mengenal sebuah pengontrol aliran program yang akan dieksekusi oleh komputer
(Threads). Dengan adanya threads dalam pemrograman java kita dapat membuat
program yang saling berurutan (sekuensial).

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();

• Mengimplementasikan interface Runnable


Cara ini merupakan cara yang paling sederhana dalam membuat thread.
Runnable merupakan unit abstrak, yaitu kelas yang mengimplementasikan
interface ini hanya cukup mengimplementasikan fungsi run(). Dalam
mengimplementasi fungsi run(), kita akan mendefinisikan instruksi yang
membangun sebuah thread. Konstruktor dari cara ini adalah :
ObjekRunnable objek = new ObjekRunnable();
Thread namavar = new Thread(Objek Runnable);
Atau dengan cara singkat seperti :
New Thread(new ObjekRunnable());

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.

Macam-macam state pada streads:

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.

b. Mekanisme Sinkronisasi Pada Java


Sinkronisasi
– Bagaimana 2 atau lebih dapat berkoordinasi satu sama lain, sehingga dapat
menjamin kebenaran program.
– Dua jenis tipe sinkronisasi: Akses eksklusif dan sinkronisasi kondisi
• Akses eksklusif (mutual exclusion)
– Resource (memori, external device) hanya boleh digunakan oleh 1thread saja
pada suatu saat tertentu
– Jika ada 2 atau lebih thread mengakses resource yang sama, mengakibatkan
terjadinya race condition: update lost
• Sinkronisasi kondisi (condition synchronization)
– Sebuah thread baru boleh melanjutkan aktivitasnya setelah kondisi tertentu
terpenuhi
– Buffer management: pembaca buffer baru bisa membaca buffer jika telah ada
thread lain yang menuliskan data ke buffer tersebut

Contoh masalah sinkronisasi: akses eksklusif


• Ada 2 buah thread yang menggunakan printer yang sama untuk mencetak
sebuah halaman yang terdiri atas header, isi dan footer. Ketiga bagian ini harus
dicetak berurutan untuk setiap threadnya,
tidak boleh selang seling.
public class Printer {
public void cetak(String nmThread) {
System.out.println("cetak header untuk"+nmThread);
System.out.println("cetak isi untuk"+nmThread);
System.out.println("cetak footer untuk"+nmThread);
System.out.println(); // baris kosong
}
}

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.

class ThreadBaru extends Thread {


public ThreadBaru(String id) {
super(id);
start(); //Mulai eksekusi thread baru
}
public void run() {
for(int i=0;i<5;i++){
try{
Thread.sleep(100);
}catch(InterruptedException e) {}
}
}
}
class DemoThread {
public static void main(String[] args) {
ThreadBaru thread1 = new ThreadBaru("Thread1");
ThreadBaru thread2 = new ThreadBaru("Thread2");
ThreadBaru thread3 = new ThreadBaru("Thread3");
System.out.println("Thread1 masih dieksekusi : " + thread1.isAlive());
System.out.println("Thread2 masih dieksekusi : " + thread2.isAlive());
System.out.println("Thread3 masih dieksekusi : " + thread3.isAlive());
//tunggu hingga semua child thread selesai dieksekusi
try{
thread1.join();
System.out.println("Thread1 selesai dieksekusi");
thread2.join();
System.out.println("Thread2 selesai dieksekusi");
thread3.join();
System.out.println("Thread3 selesai dieksekusi");
}catch(InterruptedException e) {
System.out.println("Thread utama diinterupsi " + e);
}
System.out.println("Thread utama selesai dieksekusi");
}
}
}
class TestSinkronisasi {
private java.util.Random random = new java.util.Random();
public void callMe(String data) {
System.out.print("[");

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.

Gambar 2. Arsitektur RMI

Untuk memanggil objek remote, pertama-tama client harus mencari objek


tersebut dengan layangan naming. Layanan ini akan menginformasikan objek
remote bahwa ada sebuah client yang melakukan koneksi. Koneksi client pada
layanan Naming ini dapat dilihat pada Gambar 3.

Gambar 3. Layanan Naming

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

b. Client Server dengan RMI


Aplikasi Client/Server merupakan suatu aplikasi di mana ada satu aplikasi yang
bertindak sebagai Server dan ada yang bertindak sebagai Client. Java
memberikan banyak pilihan untuk membuat aplikasi Client/Server salah satunya
yaitu dengan menggunakan Remote Method Invocation (RMI). Remote Method
Invocation (RMI) pada bahasa Java menyediakan semua lapisan yang
dibutuhkan oleh objek Java untuk berkomunikasi dengan objek Java lainnya
menggunakan pemanggilan method secara normal. Proses ini bisa terjadi jika
sistem baik yang menjadi server dan Client bisa berkomunikasi melalui TCP/IP,
sehingga aplikasi Client/Server bisa dikembangkan tanpa streaming dan socket.

c. Aplikasi dengan RMI


Ketika menggunakan RMI untuk membuat sebuah aplikasi, ada beberapa
langkah yang harus diikuti.
Adapun langkah-langkah tersebut seperti berikut:
• Desain dan implementasi komponen-komponen aplikasi dalam hal ini
adalah Interface remote, objek Remote dan Client;
• Langkah selanjutnya adalah proses kompilasi semua kode program dan
menghasilkan stubs serta skeleton.
• Membuat kelas-kelas yang berhubungan dengan jaringan dapat diakses oleh
client.
• Menjalankan aplikasi.
1. Unified Modeling Language (UML)
Unified Modelling Language (UML) adalah sebuah bahasa untuk
menentukan, visualisasi, konstruksi dan mendokumentasi informasi-
informasi dari sistem aplikasi, untuk memodelkan bisnis dan sistem
nonaplikasi lainnya. UML merupakan suatu kumpulan teknik terbaik yang
telah terbukti sukses dalam memodelkan sistem yang besar dan kompleks.
4. CORBA
a. Struktur OMG
b. Standarisasi Proses
5. Voyager dan Mobile Agents
a. Lingkungan Voyager
b. Remote Object

Anda mungkin juga menyukai