Pengetahuan Dasar Pemrograman MultiThread di C#

C# memungkinkan kita mengeksekusi  code secara  parallel melalui  multi-threading.

Apa yg dimaksud dgn Thread

Thread adalah potongan kode yg independent (dari sebuah proses)  yang di ekseskusi oleh CPU yg penjadwalanya di lakukan oleh Operating sytem . Thread dibuat oleh programmer, bagian mana saja yg akan dijadikan thread ditentukan oleh programmer. Setiap thread mendapat jatah waktu  dikerjakan CPU yg disebut quantum.

Perbedaan Multi-Tasking dan Multi-treading

Multitasking adalah beberapa proses aplikasi yang dijalankan secara paralel (sebenarnya sih dijalankan bergantian secara cepat) oleh operating system contohnya anda menjalankan program ms.excel sambil  membuka program  musik WinAmp .  Kita merasakan program  excel dan winamp berjalan bersamaan , padahal sebenarnya CPU diperintahkan oleh  OS mengeksekusi  program excel dan winamp secara bergantian dgn kecepatan tinggi.

Multi-treading adalah beberapa tread potongan program dlm satu proses  yang dilaksana secara paralel (sebenernya sih bergantian secara cepat( kecuali prosesornya multi core)  dan thread dibuat oleh programmer. Contohnya adalah sebuah program server misal chat server maka ia harus melayani permintaan client  yang datang hampir bersamaan secara paralel. server akan membuat thread untuk melayani tiap client yg datang. setiap client dilayani oleh satu thread. sehingga tidak ada antrian jika client yang datang banyak.

Untuk melihat Prosses dan thread yang sedang aktif di OS windows anda bisa menekan Alt+Ctrl+Del  klik menu Task Manager maka akan tampil sbb:

(jika kolom thread tdk tampak , klik menu View ->select colom->di centang/check  thread count.)

Daftar Proses dan jumlah threadnya pada OS windows

Perumpamaan lain multi-threading adalah  Koki di restoran  yang mempunyai anak buah. Untuk setiap pelanggan dilayani oleh 1 anak buah jadi pelanggan tdk perlu menunggu lama. Koki nya adalah program/proses, anak buah kokinya adalah thread.

ilustrasi perbandingan mono thread  dan multi thread

Daur hidup thread

Thread dalam setiap saat mempunyai satu keadaan  dari beberapa keadaan sebagaimana gambar berikut ini:

thrad_lifecycle

Beberapa contoh manfaat Thread

 – Pada user interface

Sebuah proses dlm program biasanya berurutan  spt ini:

Input data->proses data->menampilkan data.

tiap  proses bisa jadi memakan waktu lama.  jika tiap proses di atas masing masing dibuatkan sebuah thread maka  ketika  data sedang di proses input data bisa tetap berlangsung dan ketika proses data sedang berlangsung bisa juga di cancel karena proses diatas berjalan secara paralel.

– Pada aplikasi  server

Misalkan aplikasi webserver , aplikasi ini melayani permintaan page untuk tiap permintaan client yg datang. Tiap client yang datang dilayani oleh 1 thread . jika pada saat yg hampir bersamaan datang 10 client maka akan dibuatkan 10 thread yg melayani secara bersamaan. contoh lain adalah program chat client -server.

Contoh ilustrasi : mencuci tumukan gelas dan piring secara bersamaan
kita buatkan 2 thread . 1 thread untuk mencuci piring dan 1 thread untuk mencuci gelas. sehingga gelas dan piring dicuci  secara paralel.

Multitreading di C#

.NET framework class library   mengelola multithreading di namespace  System.Threading.  adapun class  classnya adalah class thread dan class monitor.   adapun  secara singkat tahapan membuat thread pada program kita adalah
1.  objek thread dibuat   dengan cara
Thread objek_thread = new thread (new Threadstart(obj_methode)
2. lalu thread dimulai dhn methode start.
keterangan:  Threadstart adalah delegate , obj_methode adalah methode yg akan dijalankan delegate threadstart.
Contoh 1 , kita membuat dua buah thread yaitu thread  pertama cuci gelas dan thread kedua cuci piring.
Program mencuci  tumpukan gelas dan tumpukan piring dgn threading

using System;
using System.Threading;   // namespace multithreading

public class MyThread {

public static void Thread1() {
for (int i = 0; i < 10; i++) {
Console.WriteLine(“cuci gelas ke {0}”, i);
Thread.Sleep(3000);
}

}

public static void Thread2() {
for (int i = 0; i < 10; i++) {
Console.WriteLine(“cuci piring ke {0}”, i);
Thread.Sleep(3000);
}
//Thread.Sleep(3000);
}
}

public class MyClass {

public static void Main() {
Console.WriteLine(“mulai mencuci tumpukan gelas dan piring “);

Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1 ) );
Thread tid2 = new Thread(new ThreadStart(MyThread.Thread2 ) );

tid1.Start();
tid2.Start();
}
}

Memang jika di lihat hasil  di layar monitor terlihat secara selang seling, tapi secara tdk terlihat  ke 2 thread di proses paralel.

hasil multithreading di monitor

Hasil program diatas adalah : piring dan gelas di cuci secara bersamaan dan selesai  secara bersamaan.

Kalau program diatas tanpa threading maka hasilnya akan berurutan mencuci gelas sampai selesai baru kemudian mencuci piring sampai selesai.

Program mencuci tumpukan gelas dan piring tanpa threading:

using System;
using System.Threading;

public class non_Thread {

public void cuci_gelas() {
for (int i = 0; i < 10; i++) {
Console.WriteLine(“cuci gelas ke {0}”, i);

}

}

public void cuci_piring() {
for (int i = 0; i < 10; i++) {
Console.WriteLine(“cuci piring ke {0}”, i);

}
}
}

public class MyClass {

public static void Main() {
Console.WriteLine(“=======================================”);
Console.WriteLine(“mulai mencuci tumpukan gelas dan piring “);
Console.WriteLine(“=======================================”);

non_Thread tid1 = new non_Thread();

tid1.cuci_gelas();
tid1.cuci_piring();

Console.WriteLine(“=======================================”);
Console.WriteLine(” Selesai…nyucinya ! “);
Console.WriteLine(“=======================================”);

}
}

program tanpa threading

Hasil dari program diatas adalah: gelas  dicuci  lebih dahulu sampai selseai  kemudian disusul piring.

Contoh ke 2 ,  dua buah thread yaitu iris cabe dan ulek bawang

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication5
{

class ThreadTester
{
static void Main( string[] args )
{
// membuat thread dan beri nama.

kerjaan_thread kerjaan1 = new kerjaan_thread();
Thread thread1 = new Thread ( new ThreadStart( kerjaan1.iris_cabe ) );
thread1.Name = “iris cabe”;

kerjaan_thread kerjaan2 = new kerjaan_thread();
Thread thread2 = new Thread(new ThreadStart(kerjaan1.ulek_bawang ));
thread2.Name = “ulek bawang”;

Console.WriteLine(“================ \n”);
Console.WriteLine( “threads di aktifkan” );
Console.WriteLine(“================ \n”);
// started state -> running state
thread1.Start();
thread2.Start();

Console.WriteLine(“====================================”);
Console.WriteLine( “semua thread (pekerjaan) stand by , siap di kerjakan KOKI ” );
Console.WriteLine(“====================================”);

}

} // end class
class kerjaan_thread
{

private int waktutidur_iriscabe ;
private int waktutidur_ulekbawang ;
private static Random random = new Random();
public kerjaan_thread()
{

waktutidur_iriscabe = 2000;
waktutidur_ulekbawang = 1000;

}
//
public void iris_cabe()
{

for (int i=0; i < 4; i++)
{
Console.WriteLine(“iris cebe ke{0}”, i);
Thread current = Thread.CurrentThread;
Console.WriteLine(current.Name +” diistirahatkan selama ” + waktutidur_iriscabe + ” detik”);
//thread.running -> thread sleeping
Thread.Sleep(waktutidur_iriscabe);
Console.WriteLine(current.Name + “bangun dari istirahat”);
Console.WriteLine(“================ \n”);
}

} // end method masak
public void ulek_bawang()
{
for (int i=0; i< 2; i++)
{
Console.WriteLine(“ulek bawang ke{0}”, i);
Thread current2 = Thread.CurrentThread;
Console.WriteLine(current2.Name + ” diistirahatkan selama ” + waktutidur_ulekbawang + ” detik”);
//thread.running -> thread sleeping
Thread.Sleep(waktutidur_ulekbawang);
// print thread name
Console.WriteLine(current2.Name + ” bangun dari istirahat”);
Console.WriteLine(“================ \n”);
}
}

} // end
}

contoh_thread2

 

Untuk melihat jumlahthread yg running dgn cara  saat program sedang jalan coba anda ketik alt-ctrl-del , kemudian pilih task manager

thread_running

 

syncronisasi thread

Jika ada dua thread yg bersamaan merubah  sebuah data, maka akan terjadi data tdk valid, untuk mencegah ini dibuat mekanisme

THREAD SYNCRON2

Sumber

http://www.codeproject.com/Articles/1083/Multithreaded-Programming-Using-C

– http://www.codeproject.com/Articles/26148/Beginners-Guide-to-Threading-in-NET-Part-1-of-n

– http://www.albahari.info/threading/threading.pdf

– http://www.techrepublic.com/article/a-beginners-guide-to-threading-in-c/1044970

About pccontrol

Berisi Tutorial Menggunakan PC untuk mengontrol Peralatan dengan cara mudah & praktis untuk pemula.

Posted on 13/03/2012, in Dasar Pemrograman, Pemrograman C# ( si sharp), Xpert-1. Bookmark the permalink. 6 Comments.

  1. using System;
    using System.Threading;

    public class MyThread {

    public void Thread1()
    {
    //x=a+b
    }

    public void Thread2()
    {
    //y= c+d
    }
    }

    public class MyClass {

    public static void Main()
    {

    MyThread thr = new MyThread();

    Thread tid1 = new Thread(new ThreadStart(thr.Thread1) );
    Thread tid2 = new Thread(new ThreadStart(thr.Thread2) );

    tid1.Start();
    tid2.Start();

    //hasil= x+y;
    }
    }

  2. gan, saya mau nanya soal multithreading. saya mau menambahkan 4 bilangan (a+b+c+d) tapi mau dilakukan secara parallel jadi seperti ini
    sum = (a+b) + (c+d) // a+b dikerjakan bersama sama dengan c+d
    kodingannya seperti apa ya ?
    mohon bantuannya.

  3. kalo threadnya memodifikasi main form gimna biar formnya ga lag?

  4. mantap kali gan, thank you for all

  5. awesome, multithreading ini nih pasti yg pak eka lg buat.

Komentar ,Saran atau Pertanyaan