Modul 8 Pemrograman Klien-Server Multithreading
Modul 8 Pemrograman Klien-Server Multithreading
CAPAIAN PEMBELAJARAN
KEBUTUHAN ALAT/BAHAN/SOFTWARE
DASAR TEORI
1
Thread merupakan sebuah bagian program yang bisa berjalan mandiri, sehingga
dua atau lebih thread dapat berjalan bersamaan, tanpa yang satu harus menunggu
selesainya yang lain. Jadi aplikasi bisa berjalan secara parallel. Thread adalah unit
terkecil dalam suatu proses yang bisa dijadwalkan oleh sistem operasi. Kadang
disebut sebagai proses ringan (lightweight).
Setiap bagian program bekerja sebagai bagian dari suatu thread. Setidaknya
dalam program stand-alone yang berjalan, terdapat sebuah thread, yaitu thread di
mana metode main() dipanggil.
Contoh threading:
o Sebuah program yang bisa menampilkan animasi sambil memproses data.
o Sebuah server game catur online yang bisa melayani beberapa pasang
user tanpa menunggu 1 pasang selesai bermain dulu.
o Program Word Processor bisa mengetik sambil melakukan pengecekan
kesalahan grammar, dan bisa sambil mengeprint juga.
Perbedaan Single-Threading dan Multi-Threading
Single-Threading adalah sebuah lightweight process (proses sederhana)
yang mempunyai threadtunggal yang berfungsi sebagai pengendali/
controller.
Multi-Threading adalah proses dengan thread yang banyak dan
mengerjakan lebih dari satu tugasdalam satu waktu.
Keuntungan Multi-Threading
1. Tanggap(responsive): Multi-Threading mengizinkan program untuk berjalan
terus walau-pun pada bagian program tersebut di block atau sedang dalam
keadaan menjalankan operasi yang lama/panjang. Sebagai contoh,
multithread web browser dapat mengizinkan pengguna berinteraksi dengan
suatu thread ketika suatu gambar sedang diload oleh thread yang lain.
2. Pembagian sumber daya: Secara default, thread membagi memori dan
sumber daya dari proses. Ketika thread berjalan pada data yang sama, thread
tersebut bisa berbagi cache memory.
3. Ekonomis: Mengalokasikan memori dan sumber daya untuk membuat proses
adalah sangat mahal. Alternatifnya, karena thread membagi sumber daya dari
proses, ini lebih ekonomis untuk membuat threads.
2
4. Pemberdayaan arsitektur multiprosesor: Keuntungan dari multi-threading
dapat ditingkatkan dengan arsitektur multiprosesor, dimana setiap thread
dapat jalan secara paralel pada prosesor yang berbeda. Pada arsitektur
prosesor tunggal, CPU biasanya berpindah-pindah antara setiap thread
dengan cepat, sehingga terdapat ilusi paralelisme, tetapi pada kenyataannya
hanya satu thread yang berjalan di setiap waktu.
Kerugian Multi-Threading
1. Multiple thread bisa mengganggu satu sama lain saat berbagi hardware
resource, misalnya chace memory.
2. Execution time (waktu proses) dari sebuah single-thread tidak dapat diimprove
(ditambah), tapi malah bisa diturunkan. Ini terjadi karena penurunan frequensi
yang dibutuhkan ketika terjadi pergantian thread yang berjalan.
3. Harus ada dukungan dari hardware ataupun software untuk melakukan multi-
Threading.
Thread dapat dibuat dengan salah satu dari dua cara berikut:
o Meng-extend java.lang.Thread
o Meng-implement java.lang.Runnable
Statement penting dalam thread:
o new (membuat sebuah thread).
o running ( instruksi yang sedang dieksekusi).
o waiting (thread menunggu sampai suatu event berjalan).
o ready (thread telah siap dijalankan dan menunggu waktu proses).
o terminated (thread selesai dieksekusi).
Method control thread:
o start() : untuk memulai eksekusi thread.
o stop() : untuk mengakhiri eksekusi thread.
o suspend() : untuk menghentikan sementara waktu.
o resume() : untuk menjalankan kembali thread yang di-suspend.
o sleep() : menghentikan thread sekian milidetik.
PRAKTIK
3
class ThreadKu implements Runnable{
Thread thr;
public ThreadKu() {
thr = new Thread(this,"Contoh Thread");
System.out.println("Eksekusi ThreadKu = "+thr);
thr.start();
}
public void run(){
try {
for(int i = 1;i<=5;i++)
{
System.out.println("Ini ThreadKu yang ke " + i);
Thread.sleep(1000);
}
}
catch (InterruptedException ie)
{
System.out.println("ThreadKu diinterupsi");
}
System.out.println("ThreadKu selesai");}
}
public class MyThread {
public static void main (String[] args){
new ThreadKu();
System.out.println("Eksekusi ThreadUtama adalah sebagai
berikut:");
try {
for(int i=10; i>=1; i--)
{
System.out.println("Ini ThreadUtama yang ke " + i);
Thread.sleep(1000);
}
}
catch (InterruptedException ie)
{
System.out.println("ThreadUtama diinterupsi");
}
System.out.println("ThreadUtama selesai");
}
}
2. Thread dengan meng-extend java.lang.Thread
Program berikut ini akan mendefinisikan sebuah kelas MyThread2 yang meng-
extends kelas Thread, dimana pembuatan program multithreading dengan
menurunkan dari kelas Thread ini lebih sederhana, walaupun secara prinsip sama
dengan pembuatan program yang menerapkan interface Runnable.
public class MyThread2 extends Thread{
public MyThread2() {
}
public static void main(String[] args)
{
MyThread2 Thread1,Thread2;
Thread1 = new MyThread2();
Thread2 = new MyThread2();
Thread1.start();
Thread2.start();
4
}
public void run(){
int delay;
for(int i=1; i<=4; i++)
{
try
{
System.out.println(getName()+"Sedang dieksekusi..");
sleep (1000);
}
catch (InterruptedException interruptEx)
{
System.out.println(interruptEx);
}
}
}
}
3. Penerapan Multithreading pada ServerSocket
ProgramServerThread
Setelah kita lakukan praktek pemrograman multithreading diatas, berikutnya akan
kita lakukan teknik multithreading sehingga program Server yang sebelumnya
hanya dapat menerima 1 koneksi client untuk kemudian dijadikan dapat menerima
koneksi lebih dari satu client.
Dalam program ini disiapkan sebuah kelas yang diturunkan dari kelas
java.lang.Thread, yang akan dieksekusi oleh thread untuk melayani setiap koneksi
yang terbentuk dengan client secara terpisah, kelas ini diberi nama
InfoKoneksiClient (sebagai Server). Pada program utama (fungsi main()), akan
dilakukan perulangan secara terus menerus untuk memangil fungsi accept().
Ketika ada koneksi dari client terbentuk, program akan menjalankan thread dari
kelas InfoKoneksiClient dengan memberikan socket koneksinya, dengan demikian
setiap ada koneksi client baru terbentuk sebuah thread baru akan dijalankan.
Berikut programnya:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
5
outToClient = new
DataOutputStream(serverSocket.getOutputStream());
outToClient.writeBytes("InfoServer versi0.1\n"+
"hanya untuk testing..\n"+
"Silahkan berikan perintah
TIME|NET|Quit\n");
boolean isQUIT = false;
while (!isQUIT)
{
dataFromClient = inFromClient.readLine();
if(dataFromClient.startsWith("TIME"))
{
outToClient.writeBytes(new
Date().toString()+"\n");
}
else if (dataFromClient.startsWith("NET"))
{
outToClient.writeBytes(InetAddress.getByName
("localhost").toString()+"\n");
}
else if(dataFromClient.startsWith("QUIT"))
{
isQUIT = true;
}
}
outToClient.close();
inFromClient.close();
serverSocket.close();
}
catch(IOException ioe)
{
System.out.println("Error:" +ioe);
}
catch(Exception e)
{
System.out.println("Error:" +e);
}
}
}
public class ProgramServerThread
{
private final static int NOMOR_PORT=1234;
6
}
}
}
ProgramClient
Untuk program client tidak perlu ada perubahan, karena mekanisme antara client
dan server tidak berubah sehingga programnya sama dengan yang ada di modul 7.
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
7
}
}
Program Server
Server MultiEchoServer ini dapat menerima koneksi dan berinteraksi dengan
banyak client pada satu waktu.
/*
* Program MultiEchoServer
* server dengan fitur multithread menerima message dari client
* dan mengirimkannya kembali ke client
*/
import java.io.*;
import java.net.*;
import java.util.Scanner;
8
input = new Scanner(client.getInputStream());
output = new PrintWriter(client.getOutputStream(),
true);
} catch (IOException ioEx) {
//ioEx.printStackTrace();
}
}
do {
//Terima pesan dari client pada input stream socket...
received = input.nextLine();
System.out.println(received);
try {
if (client != null) {
System.out.println("Menutup koneksi...");
client.close();
}
} catch (IOException ioEx) {
System.out.println("Penutupan koneksi gagal!");
}
}
}
Program Klien
Sedangkan client untuk memanfaatkan server tersebut, pada kelas MultiEchoClient,
diperlihatkan pada kode berikut:
/*
* Program MultiEchoClient
* Digunakan untuk membangun koneksi ke server MultiEchoServer
* Mengirimkan pesan teks ke server dan menerima balasannya
*/
import java.io.*;
import java.net.*;
import java.util.Scanner;
9
System.exit(1);
}
sendMessages();
}
LATIHAN
10
TUGAS
REFERENSI
1. https://www.javatpoint.com/socket-programming
2. https://docplayer.info/49613446-Sistem-operasi-thread-dan-
multithreading.html
3. https://www.academia.edu/25177814/_Modul_Konsep_Jaringan_Bab_
12_Socket_Programming
4. https://komputasi.wordpress.com/2010/11/02/java-contoh-server-
client-multi-thread/
5. https://docplayer.info/49613446-Sistem-operasi-thread-dan-
multithreading.html
6. https://www.sinaungoding.com/konsep-multithreading-java/
7. https://slideplayer.com/slide/9605738/
8. http://yuliana.lecturer.pens.ac.id/Prog%20Lanjut/Networking/socket.pdf
11