Simple Thread di C#
hua.., sudah lama gak posting sejak posting pertama. jadi punya utang banyak nih, ditambah denda jadinya ~30 postingan. ya sudah di bayar sambil jalan saja.
karena sekarang saya menggunakan ms vista dari usdi dengan hanya mengeluarkan dana IDR 50000 dan terinspirasi dari tulisan ronald dan tulisan saya beberapa waktu yang lalu di wordpress, saya coba menulis sebuah contoh sangat sederhana membuat thread di c#. kelas thread di c# ada di namespace System.Threading, jadi untuk membuat thread kita perlu ambil kelas dari sana.( setau saya) di .net terdapat 3 model thread STA, MTA, dan unknown. disini saya tidak akan membahas tentang masing - masing model tersebut, tapi akan lebih membahas contoh thread sederhana dalam c#.
ok, sekarang kita definisikan sebuah operasi yang akan dijadikan thread, dalam hal ini kita buat operasi penghitungan nilai faktorial dari beberapa bilangan bulat. untuk alasan suka - suka saya keeleganan, saya memisahkan kode program dalam dua kelas, kelas pertama untuk definisi operasi, dan kelas kedua untuk mengeksekusi operasi (sebagai driver). tidak perlu panjang lebar mari kita lihat kode programnya:
public class SimpleThread
{
private int idx;
private int[] arrInt = { 10, 4, 15, 6, 7, 18, 9 };
public SimpleThread(int i) {
idx = i;
}
// non-recursive factorial
public long Factorial(int val)
{
long fact = 1;
try
{
// biar kode gak panjang, asumsi input pasti >= 1
for (int i = 1; i <= val; i++)
{
fact *= i;
}
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
return fact;
}
public void itungFactorial()
{
long fact = Factorial(arrInt[idx]);
Console.WriteLine("{0}. {1}! = {2}",idx+1,arrInt[idx],fact);
Thread.Sleep(300);
}
}
nah, di kelas simpleThread, saya mendefinisikan method Factorial(int val) untuk menghitung nilai faktorial dari bilangan bulat val, dan sebuah method wrapper itungFactorial() untuk wrapper method Factorial(int val); method inilah yang nanti akan di passing dalam sebuah thread di kelas MainThread. kelas MainThread cuma berisi main class, untuk mengeksekusi penghitungan factorial dalam sebuah thread. nah sekarang kita definisikan kelas MainThread:
public class MainThread
{
public static void Main(string[] args)
{
long start0, end0, start1, end1;
Console.WriteLine("<<<<<<<<<Serial>>>>>>>>>");
start0 = DateTime.Now.Ticks; // start serial exc
for (int i = 0; i < 7; i++) {
SimpleThread st0 = new SimpleThread(i);
st0.itungFactorial();
}
end0 = DateTime.Now.Ticks; // end serial exc
Console.WriteLine("<<<<<<<<<Paralel>>>>>>>>>");
start1 = DateTime.Now.Ticks; // start paralel exc
for (int i = 0; i < 7; i++)
{
SimpleThread st = new SimpleThread(i);
Thread t = new Thread(new ThreadStart(st.itungFactorial));
t.Start();
}
end1 = DateTime.Now.Ticks; // end paralel exc
Console.WriteLine("<<<<<<<<<Info>>>>>>>>>");
Console.WriteLine("waktu serial = {0}\nwaktu paralel = {1}", end0 - start0, end1 - start1);
Console.WriteLine("paralel {0}x lebih cepat dari serial", ((double)(end0 - start0) / (end1 - start1)));
}
}
dan sekarang kita compile dan eksekusi:
nah, terlihat bahwa eksekusi secara paralel ternyata terbukti lebih cepat untuk satu kasus ini. hasil eksekusi memang tidak selalu sama dengan ini, tapi kurang lebih seperti itulah hasilnya.
sebagai catatan, untuk memeriksa waktu eksekusi jangan menggunakan properti DateTime.Now.Milisecond, bahaya !, soalnya yang di ambil adalah milidetik relatif terhadap detik sekarang; oleh karena itu saya menggunakan DateTime.Now.Ticks; soalnya sekalian mau ngitung durasi eksekusi. untuk sementara sebagai pemanasan ini dulu saja postingan saya :).