timer task dan thread beserta penggunaanya

7
Timer Task dan Thread Beserta Penggunaanya Disusun Oleh : Donny Avianto / 5696 SEMESTER GASAL 2010/2011 LABORATORIM JARINGAN KOMPUTER

Upload: donny-charles-sanders

Post on 26-Jun-2015

146 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Timer Task Dan Thread Beserta Penggunaanya

Timer Task dan Thread Beserta Penggunaanya

Disusun Oleh :

Donny Avianto / 5696

SEMESTER GASAL 2010/2011

LABORATORIM JARINGAN KOMPUTER

PROGRAM STUDI TEKNIK INFORMATIKA

FAKULTAS TEKNOLOGI INDUSTRI

UNIVERSITAS ATMA JAYA YOGYAKARTA

Page 2: Timer Task Dan Thread Beserta Penggunaanya

Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya,

bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah program tertentu.

Penggunaan sistem operasi modern saat ini telah mendukung kemampuan untuk menjalankan

beberapa program. Misalnya, pada saat Anda mengetik sebuah dokumen di komputer Anda dengan

menggunakan text editor, dalam waktu yang bersamaan Anda juga dapat mendengarkan musik, dan

surfing lewat internet di PC Anda. Sistem operasi yang telah terinstal dalam computer Anda itulah

yang memperbolehkan Anda untuk menjalankan multitaskting. Seperti itu juga sebuah program

(ibaratkan di PC Anda), ia juga dapat mengeksekusi beberapa proses secara bersama-

sama(ibaratkan beberapa aplikasi berbeda yang bekerja pada PC Anda). Sebuah contoh aplikasi

adalah HotJava browser yang memperbolehkan Anda untuk browsing terhadap suatu page,

bersamaan dengan mendownload object yang lain, misalnya gambar, memainkan animasi, dan juga

file audio pada saat yang bersamaan.

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

Page 3: Timer Task Dan Thread Beserta Penggunaanya

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. Dengan menggunakan AWT atau Swing,

buatlah sebuah banner sederhana yang akan mencetak string yang dituliskan oleh user. String ini

akan ditampilkan secara terus menerus dan program Anda harus memberikan ilustrasi bahwa string

tersebut bergerak dari kiri ke kanan. Untuk memastikan bahwa proses perpindahannya tidak terlalu

cepat, Anda sebaiknya menggunakan method sleep dari class Thread. Berikut ini adalah sebuah

contoh dimana Anda menuliskan ”Your name here!”.

Class Timer merupakan salah satu pengembangan dari versi Java 1.3, dalam lingkup J2SE

berupa pembentukan class-class yang mempermudah pengaturan penjadwalan proses agar dapat

dieksekusi melalui pengaksesan fungsi dasar thread. Pembaharuan diatas juga dapat dimanfaatkan

oleh pengembang pemrograman berbasis mobile (J2ME) karena class baru diatas juga telah menjadi

bagian dalam MIDP (). Contoh aplikasi yang menggunakan kelas ini adalah Efek Flipping pada

Screen Blackberry. Aplikasi ini akan membuat User interface yang benar-benar cantik. Acuan yang

didapat adalah beberapa desain grafis tampilannya, sebuah file flash yang menampilkan efek

loading yang cantik dan yang efek flip pada perpindahan halaman untuk iPod. Perpindahan dari

halaman satu ke halaman berikutnya selalu diawali dengan efek seolah-olah halaman sebelumnya

berputar dengan sumbu melintang (horizontal) di bagian tengah layar. Cantik sekali. Lalu hal itu

coba dibuat untuk platformBlackberry. Dalam efek ini dibuat seolah-olah layar sebelumnya dibuka

ke kiri, seperti ketika kita membuka halaman buku. Seperti gambar berikut ini.

Page 4: Timer Task Dan Thread Beserta Penggunaanya

Sebelum membuat class untuk screen ini, dipersiapkan gambar mobil Renault Clio warna merah

yang nanti akan digunakan dalam program. Gambar ini digunakan hanya agar memperindah

screenshot saja.

Untuk mengimplementasikan efek ini, teorinya sederhana. Pertama lakukan extends pada

MainScreen, karena efek ini akan berlaku untuk screen. Kemudian, di dalam constructor-nya,

persiapkan gambar screenshot dari layar sebelumnya dan saya simpan ke dalam variable member

instance PNGEncodedImage. Langkah berikutnya adalah membuat method animate() yang berisi

instansiasi variable Timer dan TimerTask. Dalam TimerTask ini, yang dilakukan adalah me-resize

gambar screenshot, kemudian invalidate(). Tugas ini akan diulang sebanyak jumlah tertentu hingga

gambar screenshot menjadi sempit sekali dan hilang. Jika perulangan sudah mencapai angka yang

ditentukan, maka kita membatalkan TimerTask tersebut, sehingga tidak lagi dijalankan oleh Timer.

Animasi selesai. Kemudian panggil method animate() ketika event onUiEngineAttached() dengan

parameter bernilai true, dengan kata lain ketika screen ditampilkan. Selain itu override method

paint() agar menampilkan bayangan dan gambar screenshot yang telah dimanipulasi tersebut setelah

method paint() sebenarnya. Adpun source code-nya adalah sebagai berikut :

package com.durianberry.ui.view;import java.util.Timer;import java.util.TimerTask;import net.rim.device.api.math.Fixed32;import net.rim.device.api.system.Bitmap;import net.rim.device.api.system.Display;import net.rim.device.api.system.EncodedImage;import net.rim.device.api.system.PNGEncodedImage;import net.rim.device.api.ui.Graphics;import net.rim.device.api.ui.component.BitmapField;import net.rim.device.api.ui.container.MainScreen;

public class FlipScreen extends MainScreen {private Bitmap img;private PNGEncodedImage encImage;private EncodedImage bg;

private Timer timer;private TimerTask task;private int count = 1;

// maximum frame numberprivate final int MAX = 100;

public FlipScreen() {

Page 5: Timer Task Dan Thread Beserta Penggunaanya

prepare();

add(new BitmapField(Bitmap.getBitmapResource("img/ui/dummy/clio.png")));

}

public void paint(Graphics g) {super.paint(g);flipLeft(g);

}

private void prepare() {// prepare the image of previous display// this could be previous page even home screenimg = new Bitmap(Display.getWidth(),

Display.getHeight());Display.screenshot(img);

// create encoded image from the bitmap,// we cannot scale bitmap, so we used encoded imageencImage = PNGEncodedImage.encode(img);bg = encImage.scaleImage32(Fixed32.ONE, Fixed32.ONE);

}private void flipLeft(Graphics g) {

if (count < MAX && bg != null) {

// draw shade behind the flipping imageint oldColor = g.getColor();g.setGlobalAlpha(0xff - (int)((double)0xff *

(double)count / (double)MAX));g.setColor(0x000000);g.fillRect(0, 0, Display.getWidth(), Display.getHeight());g.setGlobalAlpha(0xff);g.setColor(oldColor);

// draw flipping imageg.drawImage(0, 0,

bg.getScaledWidth(), Display.getHeight(),bg, 0, 0, 0);

}}private void animate() {

timer = new Timer();task = new TimerTask() {

public void run() {if (count < MAX) {

// scale image, make the image tinier each timebg = encImage.scaleImage32(Fixed32.div(

Fixed32.toFP(MAX), Fixed32.toFP(MAX - count)

), Fixed32.ONE);invalidate();count ++;

} else {bg = null;invalidate();timer.cancel();

}}

};// refresh every 7 mili secondtimer.scheduleAtFixedRate(task, 7, 7);

}protected void onUiEngineAttached(boolean attached) {

if (attached) {// do animation when this screen displayedanimate();

}super.onUiEngineAttached(attached);

}}