Java Thread Games Series

dokumen-dokumen yang mirip
BAB 2 COLLECTION & THREAD

Pada pembuatan game di java, sering kali para programer. mendefinisikan banyak object seperti suara, gambar, dan grafik geometri yang

Pemrograman Berorientasi Obyek (IT251) Ramos Somya, S.Kom., M.Cs.

1. Latar Belakang Didalam pembuatan game java sering kali kita mendefinisikan banyak object seperti gambar, dan grafik geometri yang begitu banyak,

ILUSTRASI KLASIK: BOUNDED BUFFER

Thread. 16 th week Estu Sinduningrum ST,MT

PERTEMUAN VII Multithreaded Programming. Praktikan mampu membuat program sederhana mengenai threading

Mengunci sebuah object: Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu

Exception Handling and Multithreading

Monitor. Process Synchronization. SISTIM OPERASI (IKI-20230) ProcessSynchronization Ch. 6. Johny Moningka

Java Progamming Multithreading

Kelompok 12. Thread Java

PENANGANAN EKSEPSI. class Exc0 { public static void main (String args[]) { int d = 0; int a = 42 / d; } }

BAB 2. Class Thread. Setelah mempelajari modul ini peserta diharapkan dapat: Mengenal Kelas Thread Menggunakan Kelas Thread dalam aplikasi

Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Tabel berikut ini adalah rangkuman dari class Thread.

BAB IX THREAD Thread ClassThread namavar = new ClassThread(); Namavar.start(); New ClassThread().start();

EXCEPTION HANDLING. 1. Mampu menangani eksepsi 2. Mengetahui dan memahami tentang multithreading 3. Dapat membuat program tentang exception handling

2. Pilih instruksi yang dapat digunakan dalam method actionperformed untuk membedakan antara tombol buttonone dan buttontwo.

1.Tujuan. 2. Latar Belakang

Network Programming 2010 Pemrograman Multi-Thread

2 TIPE DATA DAN VARIABEL

Laporan Tugas Scheduling Pengantar Sistem Operasi

TUGAS SISTEM TERDISTRIBUSI MULTYTHREAD EKO SURIPTO P

PEMROGRAMAN BERORIENTASI OBJEK COLLECTION DAN MULTITHREADING. ADAM MUKHARIL BACHTIAR TEKNIK INFORMATIKA UNIKOM

Bab 26. Readers/Writers

BAB II VARIABEL DAN TIPE DATA

1. Mampu mengimplementasikan thread dalam sebuah aplikasi 2. Memahami kegunaan thread dalam aplikasi

Pemrograman Berorientasi Objek Collection dan Multithreading. Adam Mukharil Bachtiar Teknik Informatika UNIKOM

BAHASA PEMROGRAMAN JAVA

A. TUJUAN PEMBELAJARAN 1. Mengetahui cara menangani exception dengan cara melempar exception. 2. Mengetahui cara membuat sendiri class exception.

SISTEM OPERASI THREAD DAN MULTITHREADING

PEMROGRAMAN JAVA : THREAD

PERCOBAAN 6 EXCEPTION

TUJUAN. Memahami Koneksi dan Pemrosesan Basis Data di Java Memahami JDBC Menggunakan MySQL pada program Java

BAB 4. SINKRONISASI & DEADLOCK

Multithreading dengan python (bagian 1)

Pengenalan JavaScript

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA

public class Test { int i = 6; int j = 3; System.out.println(i/j); } Output :

Definisi (1) ready, dll.) Sering disebut dengan lightweight process. register set, dan stack. sama.

PRAKTIKUM 6 EXCEPTION

Percobaan 6 Exception

PERTEMUAN 7 MULTITHREADED PROGRAMMING

Tutorial Web Service JAX-WS Konverter Suhu dengan NetBeans

MENGENAL JAVA SEBAGAI PEMROGRAMAN BERORIENTASI OBJEK DAN IMPLEMENTASI THREAD DI LINGKUNGAN UNIX/ LINUX. Hary Cahyono

Membuat dan Menggunakan Class

Score: Persentase: % ~ u ~ Generated by Foxit PDF Creator Foxit Software For evaluation only.

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA QUEUE

Modul 4 Exception, I/O, dan Operasi File

Asynchronous Programming (Async dan Await) pada C# 6.0

PEMAHAMAN DASAR DASAR JAVA

Operating System. Thread. Fak. Teknik Jurusan Teknik Informatika Universitas Pasundan. Dosen : Caca E. Supriana, S.Si

PERTEMUAN III OBJEK DAN CLASS TUJUAN PRAKTIKUM

Badiyanto, S.Kom., M.Kom. PBO java

LAPORAN RESMI. PRAKTIKUM TEKNOLOGI WEB Pengenalan JavaScript

Grouping Object. Viska Mutiawani, M.Sc

IF PEMROGRAMAN LANJUT EXCEPTION. Oleh : Andri Heryandi, M.T.

Fajar Yusran Zebua DASAR ANIMASI

E-Book PEMROGRAMAN BERORIENTASI OBJEK. Disusun Oleh: Arfian Hidayat, S.Kom

Processes. Processes. SISTIM OPERASI (Operating System) IKI-20230

Krisna D. Octovhiana. 1.1 Mengenal Struktur Kontrol.

Pemrograman Berorientasi Obyek. Exception Handling. Politeknik Elektronika Negeri Surabaya

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR

Didalam menampilkan peta yang sudah kita buat, kita akan menggunakan Slick2D sebagai sebuah frameworknya.

1. Apa yang harus dilakukan oleh programmer untuk menangani user-defined exception? Menuliskan exception sebagai start method

Sukses. Kesalahan pada URL. File tidak lengkap. Kesalahan umum

Menangkap Kesalahan (Error Handling)

CRITICAL REGIONS DAN MONITORS

PEMROGRAMAN SOCKET LANJUTAN

Membuat Aplikasi Chatting Dengan Java

Integrasi Animasi Dengan Java

IKG2I4 / Software Project I

M.Octaviano Pratama

BONUS. Dasar Java Mobile. Mengenal Java Mobile Mengenal MIDlet Mobile Grafis Mobile Animasi Latihan Soal

Variabel tersebut seharusnya bisa dideklarasikan didalam try block dan block catch

Waktu Sisa : 0:43:4. Sukses. Kesalahan pada URL. File tidak lengkap. Kesalahan umum. Mengerjakan finally. Diluar block

1. Manakah jawaban yang benar,pada saat Anda mengcompile dan menjalankan class berikut ini:

Contoh (3) Solusinya adalah dengan membuat web server menjadi multi-threading. Dengan ini maka sebuah web server akan membuat thread yang akan mendeng

Pertemuan 2 Struktur Kontrol Percabangan

Pemrograman Berorientasi Obyek. Dasar Pemrograman Java

OBJECT ORIENTED PROGRAMMING (OOP)

EXCEPTION. 2. Pada kondisi bagaimana klausa finally tidak akan dieksekusi? Kode didalam block try memiliki statement return

Exception adalah penanda bahwa kondisi/kejadian yang tidak diinginkan telah terjadi pada program kita. Ada 2 jenis exception (+1 Error):

Praktikum 9 Exception Handling

1/5. while and do Loops The remaining types of loops are while and do. As with for loops, while and do loops Praktikum Alpro Modul 3.

Tujuan Intruksional. Mampu menjelaskan tentang event handling Mampu menjelaskan tentang method Mampu menggunakan event handling Mampu membuat method

Threads of Control. Iwan Setyawan Adji, TE Jurusan Teknik Elektro FT UGM, Yogyakarta

Berikut merupakan salah satu contoh dari pesan SOAP (SOAP Message):

Elemen Dasar Dalam Bahasa Java

Program Java Sesi 1. Arief Susanto

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom

Exception Handling. Prepared by Viska Mutiawani. 1

Obyektif : KONTROL ALUR PROGRAM

- Setiap pola yang menggambarkan permasalahan yang terjadi secara berulang, serta

Tidak ada satupun dari pilihan di atas yang benar karena checked exception tidak bisa ditulis

int i = 0; while (i < 10) { System.out.println( Informatika Unpas ); i++; }

1. Mana diantara pilihan-pilihan berikut ini yang merupakan penulisan loop yang benar?

TUGAS Mata Kuliah : Sistem Terdistribusi

DASAR PEMOGRAMAN JAVA

Transkripsi:

Java Thread Games Series Amru Rosyada taka86@gmail.com http://amrurosyada.blogspot.com Lisensi Dokumen: Seluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dan disebarkan secara bebas untuk tujuan bukan komersial (nonprofit), dengan syarat tidak menghapus atau merubah atribut penulis dan pernyataan copyright yang disertakan dalam setiap dokumen. Tidak diperbolehkan melakukan penulisan ulang, kecuali mendapatkan ijin terlebih dahulu dari IlmuKomputer.Com. Multithreading sangat diperlukan dalam games engineering, karena dalam sebuah games diperlukan adanya pemrosesan yang berjalan bersama2 misalnya ketika kita membuat games realtime strategi seperti red alert, berapa banyak thread yang dibutuhkan??, apalagi kalo membuat games seperti football manager (my favourite) dimana setiap club bahkan setiap pemain akan mempunyai perubahan perilaku, skill, usia, mood, technique dll dalam siklus tertentu. Dalam dunia nyata-pun tak dapat dipisahkan, simpelnya saja nih... ketika kita browsing browser membuka banyak tab dan tiap2 tab mengkses halaman web yang berbeda itu juga merupakan proses multithreading, sedangkan disisi server seperti webserver akan membuat thread jika ada request yang masuk. Pendahuluan Dalam java untuk membuat thread ada 3 cara : 1. Menurunkan class Thread (Extends) 2. Mengimplementasikan interface Runnable 3. Menggunakan anonymous inner class Isi Sekarang kita akan bahas satu persatu bagaimana ketiga cara itu digunakan : ex, dengan menurunkan class thread : public class MyThread extends Thread { System.out.println("Ini threading lho!!!"); Thread mythread = new MyThread(); mythread.start(); ex, dengan mengimplementasikan interface Runnable: dengan menggunakan cara ini mempunyai keuntungan class yang kita buat masih bisa menurunkan class yang lain, karena java tidak mengijinkan multiple inharitance 1

public class MyThread extends SomeOthersClass implements Runnable { public MyThread() { System.out.println("threading pake implementd Runnable"); Thread mythread = new Thread(new MyThread); mythread.start(); ex, menggunakan anonymous class: dengan ini kita tidak perlu untuk menurunkan class Thread dan mengimplementasikan interface Runnable. new Thread() { System.out.println("menggunakan anonymous class");.start(); keruagian menggunakan cara ini adalah membuat code yang kita bikin menjadi sulit untuk dibaca dan dipahami. gunakan method join agar thread yang kita gunakan masuk keantrian dan mengunggu sampai thread yang lain selesai. myhtread.join(); method ini sangat berguna ketika kita membuat games dan player ingin keluar dari permainan, untuk memastikan bahwa semua thread telah selesai sebelum menjalankan cleanup. Kita juga melakukan sleep untuk thread yang sedang berjalan dengan presisi waktu dalam milidetik. mythread.sleep(1000); Sinkronisasi Misalkan kita mau membuat maze game (games untuk mencari jalan keluar). Thread manapun bisa mengubah posisi pemain/player, dan thread manapun bisa melakukan pemeriksaan apakah ada pemain yang sudah menemukan pintu keluar. Untuk mempermudah mari kita lihat pada ilustrasi berikut, kita asumsikan bahwa jalan keluar/exit berada di x=0, y=0 : public class Maze { private int playerx; 2

private int playery; public boolean isatexit() { return (playerx==0 && playery==0); public void setposition(int x, int y) { playerx=x; playery=y; secara garis besar code diatas tidak akan bermasalah, tapi bagai mana jika terjadi preemtive (banyak thread yang mengakses dan mana yang didahulukan untuk dapat mengubah resource). Misalkan kita ambil sekenario sebagai berikut, pamain berpindah tempat dari (1,0) ke (0,1): 1. Dimulai dari posisi (1,0), variabel playerx=1 dan playery=0 2. Thread A memanggil setposition(0,1) 3. Ketika line playerx=x dieksekusi maka playerx bernilai 0 4. Tiba-tiba Thread B melakukan pengecekan pada isatexit() sebelum A sempat mengubah nilai playery maka B akan mendapatkan kembalian bernilai true, karena playerx dan playery sedang dalam keadaan yang sama yaitu bernilai 0. sekarang kita akan melakukan sinkronisasi untuk mencegah terjadinya hal diatas. Kodenya akan berubah menjadi sebagai berikut : public class Maze { private int playerx; private int playery; public synchronized boolean isatexit() { return (playerx == 0 && playery == 0); public synchronized void setposition(int x, int y) { playerx = x; playery = y; ketika JVM mengeksekusi method yang beratribut sinchronized, maka akan terjadi ackquire lock pada method tersebut dan hanya akan mengijinkan untuk dieksekusi oleh satu object pada suatu waktu. Jadi jika suatu sinchronized method belum selesai dieksekusi maka method sinchronized lain tidak akan bisa dieksekusi. public synchronized void setposition(int x, int y) { playerx = x; playery = y; code diatas bisa juga ditulis dalam bentuk berikut: 3

public void setposition(int x, int y) { synchronized(this) { playerx = x; playery = y; pada code mempunyai jumlah bytecode yang lebih banyak. Sinkronisasi object seperti kode kedua diatas berguna jika kita mengijinkan lebih dari satu lock, dan tidak membutuhkan untuk sinkronisasi untuk methodnya. Lock bisa dilakukan pada object apapun kecuali pada tipe primitive, berikut adalah contoh bagaimana lock dilakukan pada object : Object mylock = new Object();... synchronized (mylock) {... Saat bagaimanakah diperlukan sinkronisasi? Jawabannya adalah setiap waktu ketika ada dua atau lebih thread melakukan akses pada suatu object/field. Hal yang perlu diingat jangan pernah melakukan oversinkronisasi (melakukan sinkronisasi pada object/method/field yang telah disinkronisasi). Sebagai contoh jangan lakukan sinkronisasi pada sebuah method jika hanya field tertentu saja yang akan disinkronisasi dalam method tersebut. Sebagai contoh method berikut, lakukan sinkronisasi pada block yang diperlukan saja. public void mymethod() { synchronized(this) { // code that needs to be synchronized // code that is already thread-safe jangan lakukan sinkronisasi pada method yang hanya menggunakan local variable, karena local variable akan ditaruh di stack, sedangkan thread punya stack untuk tiap2 thread, jadi tidak perlu untuk dilakukan sinkronisasi. Berikut adalah contoh method yang tidak perlu dilakukan sinkronisasi karena hanya menggunakan variable local. public int square(int n) { int s = n * n; return s; jika kita tidak yakin thread mana yang sedang mengakses kode kita, kita bisa mendapatkan nama dari thread tersebut dengan : 4

Thread.currentThread().getName(); Perlu diwaspadai juga adanya deadlock, deadlock adalah adanya thread yang tidak bisa melanjutkan proses karena thread saling menunggu thread lain sampai melepaskan resource. Misalkan pada contoh berikut : 1. Thread A acquire lock 1. 2. Thread B acquire lock 2. 3. Thread B menunggu sampai lock 1 dilepaskan. 4. Thread A menunggu sampai lock 2 dilepaskan. Dapat kita lihat dari process diatas kedua thread saling menunggu samapai suatu waktu yang tidak bisa ditentukan. Kita bisa mengatasinya dengan cara melakukan sinkronisasi yang tepat sesuai dengan urutannya. Menggunakan wait() dan notify() Misalkan kita ambil sekenario sebagai berikut, ada dua thread yang akan saling berkomunikasi satu sama lain, sebagai contoh ada thread A menunggu sampai thread B mengirimkan pesan : // Thread A public void waitformessage() { while (hasmessage == false) { Thread.sleep(100); // Thread B public void setmessage(string message) {... hasmessage = true; kode diatas bukan suatu contoh yang baik, karena thread A melakukan pengecekan setiap 100 milisecond atau 10 kali dalam satu detik. Thread A dapat oversleep dan terlambat dalam mendapatkan pesan. Alangkah lebih baik jika A idle sampai ada notifikasi dari B bahwa pesan sudah bisa dikonsumsi, dan ini bisa dilakukan dengan pasangan method wait() dan notify(). Method wait() digunakan didalam blok synchronized. Ketika method wait() dieksekusi, lock akan dilepaskan dan menunggu sampai ada notifikasi. Method notify() juga digunakan didalam block synchronized. Method notify akan memberikan notifikasi pada thread yang menunggu pada lock yang sama. Jika ada banyak thread yang menunggu maka hanya akan ada satu notifikasi dan akan dipilih satu thread secara acak. Berikut adalah kode yang telah diperbaiki : // Thread A public synchronized void waitformessage() { try { wait(); catch (InterruptedException ex) { // Thread B public synchronized void setmessage(string message) { 5

... notify(); jika kita ingin memberika notifikasi untuk semua thread yang sendang menunggu kita bisa menggunakan notifyall(), method wait() juga menerima parameter dalam milisecond sebagai waktu tunggu, misalnya kita ingin memberikan timeout sampai 100milisecond maka kita bisa menggunakan wait(100). Method wait(), notify(), dan notifyall() merupakan method dari class object, sehingga semua java object mempunyai method2 tersebut. Kapan kita seharusnya menggunakan thread? Jadi begini dari pendekatan games, ketika games play loading untuk kenyamanan pengguna sebaiknya ketika loading dibuatkan thread sendiri sehingga player tidak menyangka bahwa gamesnya sedang ngehang. Kalo dari pendekatan lain sebenarnya juga untuk kenyamanan dan optimasi, nyaman untuk pengguna karena pengguna merasa menggunakan program yang cepet loadingnya (tricky), optimal karena bisa memanfaatkan resource CPU yang belum termanfaatkan. Sum it up Oke dengan informasi thread yang telah dibahas sebelumnya, mari kita buat sesuatu yang berguna yaitu thread pool. Thread pool merupakan sebuah group dari thread yang didesain untuk mengeksekursi tugas yang bermacam-macam. Pada thread pool kita bisa memilih jumlah dari thread didalam pool dan menjalankan task yang didefinisikan sebagai Runnable. Berikut adalah contoh menggunakan ThreadPool dengan membuat 8 thread dalam pool, menjalankan task sederhana dan kemudian menunggu samapai task selesai dijalankan. ThreadPool mythreadpool = new ThreadPool(8); mythreadpool.runtask(new Runnable() { System.out.println("Do something cool here."); ); mythreadpool.join(); Method runtask() akan dijalankan. Jika semua thread di dalam pool sedang sibuk menproses task, ketika memanggil runtask() akan memasukkan task kedalam antrian sampai ada thread yang mengeksekusinya. Berikut adalah kode ThreadPool.java : import java.util.linkedlist; A thread pool is a group of a limited number of threads that are used to execute tasks. public class ThreadPool extends ThreadGroup { private boolean isalive; private LinkedList taskqueue; private int threadid; private static int threadpoolid; Creates a new ThreadPool. 6

@param numthreads The number of threads in the pool. public ThreadPool(int numthreads) { super("threadpool-" + (threadpoolid++)); setdaemon(true); isalive = true; taskqueue = new LinkedList(); for (int i=0; i<numthreads; i++) { new PooledThread().start(); Requests a new task to run. This method returns immediately, and the task executes on the next available idle thread in this ThreadPool. <p>tasks start execution in the order they are received. @param task The task to run. If null, no action is taken. @throws IllegalStateException if this ThreadPool is already closed. public synchronized void runtask(runnable task) { if (!isalive) { throw new IllegalStateException(); if (task!= null) { taskqueue.add(task); notify(); protected synchronized Runnable gettask() throws InterruptedException { while (taskqueue.size() == 0) { if (!isalive) { return null; wait(); return (Runnable)taskQueue.removeFirst(); Closes this ThreadPool and returns immediately. All threads are stopped, and any waiting tasks are not executed. Once a ThreadPool is closed, no more tasks can be run on this ThreadPool. public synchronized void close() { if (isalive) { isalive = false; taskqueue.clear(); interrupt(); 7

Closes this ThreadPool and waits for all running threads to finish. Any waiting tasks are executed. public void join() { // notify all waiting threads that this ThreadPool is no // longer alive synchronized (this) { isalive = false; notifyall(); // wait for all threads to finish Thread[] threads = new Thread[activeCount()]; int count = enumerate(threads); for (int i=0; i<count; i++) { try { threads[i].join(); catch (InterruptedException ex) { A PooledThread is a Thread in a ThreadPool group, designed to run tasks (Runnables). private class PooledThread extends Thread { public PooledThread() { super(threadpool.this, "PooledThread-" + (threadid++)); while (!isinterrupted()) { // get a task to run Runnable task = null; try { task = gettask(); catch (InterruptedException ex) { // if gettask() returned null or was interrupted, // close this thread by returning. if (task == null) { return; // run the task, and eat any exceptions it throws try { task.run(); catch (Throwable t) { uncaughtexception(this, t); 8

Sekarang kita akan mencoba untuk melakukan test pada ThreadPool class, berikut adalah kode untuk melakukan test yaitu ThreadPoolTest class. Berikut adalah cara untuku menjalankan ThreadPoolTest : java ThreadPoolTest 8 4 8 merupakan jumlah task yang akan dijalankan, 4 adalah jumlah thread yang akan dijalankan. Berikut kode ThreadPoolTest.java : public class ThreadPoolTest { public static void main(string[] args) { if (args.length!= 2) { System.out.println("Tests the ThreadPool task."); System.out.println( "Usage: java ThreadPoolTest numtasks numthreads"); System.out.println( " numtasks - integer: number of task to run."); System.out.println( " numthreads - integer: number of threads " + "in the thread pool."); return; int numtasks = Integer.parseInt(args[0]); int numthreads = Integer.parseInt(args[1]); // create the thread pool ThreadPool threadpool = new ThreadPool(numThreads); // run example tasks for (int i=0; i<numtasks; i++) { threadpool.runtask(createtask(i)); // close the pool and wait for all tasks to finish. threadpool.join(); Creates a simple Runnable that prints an ID, waits 500 milliseconds, then prints the ID again. private static Runnable createtask(final int taskid) { return new Runnable() { System.out.println("Task " + taskid + ": start"); // simulate a long-running task try { Thread.sleep(500); catch (InterruptedException ex) { System.out.println("Task " + taskid + ": end"); ; 9

oke all thing are finished. Penutup Diharapkan dengan adanya artikel ini bisa membantu dalam meningkatkan kemajuan teknologi informasi di Indonesia dan mendukung suksesnya IGOS Referensi Http://java.sun.com David Brackeen, Bret Barker, Laurence Vanhelsuwé, Developing Games in Java, 2003, New Riders Publishing Biografi Penulis Amru Rosyada. Lahir pada tanggal 22 Mei 1986, menamatkan pendidikan dasar sampai pendidikan menengah akhir di kota Ngawi kemudian terdampar di Jogja mengambil program Diploma tiga Teknik Elektro Universitas Gadjah Mada dan Sekarang masih menamatkan Strata satu di Ilmukomputer Universitas Gadjah Mada. 10