- Method statis Thread.sleep( ) memaksa sebuah Thread untuk meninggalkan keadaan / operasi yang berjalan hingga durasi sleep-nya selesai. Thread.sleep(200) membuat sebuah Thread tertidur selama 200 milidetik.
- Method sleep( ) memberikan sebuah Exception (InterruptedException – Exception yang diinterupsi) sehingga semua panggilan method sleep ( ) HArUS di “bungkus” dengan sebuah TRY/CATCH.
- Kita dapat menggunakan method sleep () untuk membantu memastikan semua thread mendapatkan kesempatan untuk berjalan/beroperasi, meskipun tidak ada yang menjamin bahwa kapan sebuah thread bangun dan beroperasi pada akhir baris terakhir ia beropeasi. Mungkin saja, contohnya, langsung kembali ke depan. Pada kebanyakan kasus, ketepatan waktu pemanggilan method sleep ( ) adalah yang kita butuhkan untuk menjaga Thread kita saling bergantian dengan baik, tanpa error.
- Kita dapat memberi nama sebuah Thread menggunakan method setName ( ). Semua thread memiliki nama secara default, tapi memberikan mereka sebuah nama eksplisit dapat membantu kita berada pada jalur thread-thread, khususnya jika kita men-debug nya dengan pernyataan print( ).
- Kita dapat mempunnyai masalah serius dengan thread jika dua atau lebih thread mempunyai akses ke objek yang sama dalam tumpukan-objek.
- Dua atau lebih thread mengakses objek yang sama dapat mengakibatkan kerusakan data jika salah satu thread, contohnya, meningalkan keadaan/operasi yang sedang dijalankannya sementara tetap pada pertengahan memanipulasi keadaan / operasi kritis sebuah objek.
- Untuk membuat objek thread kita AMAN, tentukan pernyataan mana yang seharusnya diperlakukan sebagau satu proses atom. Dengan kata lain, tentukan method mana yang HARUS beroperasi hingga selesai sebelum thread lainnya mengekseskusi method yang sama pada objek yang sama.
- Gunakan kata kunci synchronized untuk memodifikasi sebuah deklarasi method, ketika kita ingin untuk mencegah dua thread sekaligus mengeksekusi method itu.
- Setiap objek memiliki sebuah gembok (lock), dengan sebuah kunci tunggal untuk gembok itu. Seringkali kita tidak peduli tentang gembok itu; gembok-gembok memiliki peran yang harus diperhatikan ketika sebuah objek memiliki method synchronized.
- Ketika sebuah thread mencoba masuk ke method synchronized, thread HARUS memiliki kunci untuk objek itu (objek dari method). Jika kunci tidak tersedia (karena thread lain memegangnya), thread akan menunggu, hingga kunci tersedia.
- Bahkan jika sebuah objek memiliki lebih dari satu method synchronized, tetap memiliki satu kunci saja. Sekali sebuah thread mengeksekusi sebuah method synchronized pada objek itu, tidak ada thread yang bisa mengeksekusi method synchronized pada objek yang sama. Pembatasan ini akan melindungi data kita dengan mensikronkan method yang ada dari pemanipulasian data.
java
Thread-Thread — JAVA
- Sebuah Thread (rangkaian) dengan sebuah huruf-kecil ‘t’ adalah sebuah thread yang terpisah dengan Eksekusi di Java Programming.
- Setiap Thread pada Java memiliki Tumpukan panggilannya sendiri.
- Sebuah Thread dengan sebuah bahasa-kapital ‘T’ adalah Class Thread pada java.lang. Sebuah objek Thread mewakili sebuah Thread yang diEksekusi.
- Sebuah Thread membutuhkan pekerjaan untuk dilakukan. Pekerjaan Thread adalah sebuah contoh sesuatu yang mengimplementasikan Interface Runnable.
- Sebuah Interface Runnable hanya memiliki sebuah method tunggal, run ( ). Ini adalah method yang akan diletakkan bawah dari panggilan tumpukan yang baru. Dengan kata lain, itu adalah method yang pertama kali dijalankan pada thread baru.
- Untuk menjalankan sebuah Thread baru, kita butuh sebuah Runnable untuk melewati Constructor dari Thread.
- Sebuah thread berada di dalam keadaan BARU ketika kita mempunyai sebuah objek Thread yang dipakai tapi belum dipanggil dengan method start ( ).
- Ketika kita mulai sebuah thread (dengan memanggil Method Start ( ) dari Objek Thread), sebuah tumpukan baru akan dibuat, dengan run ( ) method dari Runnable yang berada di bawah tumpukan. Thread sekarang mulai dalam keadaan RUNNABLE, menunggu untuk dijalankan.
- Sebuah thread mengatakan untuk menjadi RUNNING ketika Penjadwal Thread dari JVM telah memilihnya untuk menjadi thread yang sedang berjalan. Pada mesin berprosessor tunggal, hanya ada satu Thread yang sedang Berjalan.
- Kadang sebuah Thread dapat dipindahkan dari keadaan RUNNING ke keadaan TERBLOK (TIdak Berjalan untuk Sementara). Sebuah Thread mungkin Terblok karena ia menunggu data dari sebuah stream (aliran data), atau karena ia telah tertidur, atau karena ia menunggu untuk penguncian Objek.
- Penjadwalan Thread tidak menjamin untuk bekerja pada cara tertentu, jadi kita tidak dapat memastikan bahwa thread-thread akan bergiliran sesuai keinginan kita. Kita dapat membantu untuk mempengaruhi mengaktifkan pengambilan dengan mengkondisikan thread anda ke keadaan sleep pada waktu-waktu tertentu.
Client and Server
- Aplikasi Client dan Server BerKomunikasi melalui Koneksi Soket (Socket Connection),
- Sebuah Soket merupakan sebuah Koneksi antara dua Aplikasi yang dapat berjalan pada dua mesin fisik yang berbeda (Client dan Server),
- Sebuah Client harus mengetahui Alamat IP (nama domain) dan nomor port TCP dari Aplikasi Server,
- Sebuah Port TCP adalah angka unsigned 16-bit yang merupakan aplikasi khusus Server. Sejumlah TCP port mengizinkan sebuah Client yang berbeda untuk terhubung pada mesin Server yang sama tapi berkomunikasi pada aplikasi server yang berbeda. Cat. 1 mesin server dapat memiliki beberapa aplikasi server, hal itu ditentukan dengan jumlah port TCP yang berada pada status “mendengarkan” (listen).
- Sejumlah Port TCP dari 0 hinga 1023 telah digunakan oleh servis yang sudah dikenal, cth. HTTP, FTP, SMTP, dll.
- Sebuah Client terhubung ke Server menggunakan kode:
Socket s=new Socket(“127.0.0.1”, 4242);
- Sekali terhubung, client dapat memperoleh Input dari server dan mengirim Output (Pesan) ke Server. Kode ini adalah Aliran Koneksi Level-Rendah (karena berbenruk bit-bit) : sock.getInputStream ( );
- Untuk membaca data teks dari Server, kita memerlukan BufferedReader yang terhubung dengan InputStreamReader. InputStreamReader terhubung dengan Socket (Server sebagai Sumber Pesan).
- InputStreamReader berperan sebagai “Jembatan” antara Bit-bit (Level Rendah) dari Socket (Server) ke bentuk karakter data (Level-Tinggi) di BufferedReader.
- Untuk Menulis teks / data ke Server, hubungkan PrintWriter ke OutputStream dari Soket. Gunakan method print( ) atau println( ) untuk menulis (mengirim) teks ke Server (Soket).
- Server menggunakan ServerSocket untuk MENUNGGU permintaan dari Client pada nomor port TCP tertentu.
- Ketika ServerSocket mendapatkan permintaan (dari client), ia “menerima (accept)” permintaan itu, kemudian membuat sebuah koneksi Soket dengan Client tsb.
File Writer dan File Reader — JAVA
- Untuk menulis sebuah file Teks, mulai dengan sebuah aliran koneksi FileWriter (Penulis File).
- “Ikatkan” FileWriter ke sebuah BufferedWriter untuk Effisiensi.
- Sebuah file Objek mewakili sebuah file pada jalur tertentu, tapi tidak mewakili isi file yang sebenarnya.
- Dengan sebuah file objek kita dapat membuat, mengutak-atik, dan menghapus daftar file (File/Folder Directory).
- Kebanyakan stream-stream (aliran) yang bisa menggunakan namaFile berupa String dapat menggunakan sebuah Objek File, dan sebuah Objek file dapat lebih aman untuk digunakan.
- Untuk membaca sebuah file Teks, mulai dengan sebuah Aliran Koneksi FileReader (Pembaca File).
- “Ikatkan” FileReader ke sebuah BufferedReader untuk Effisiensi.
- Untuk mengurai sebuah File Teks, kita harus memastika sebuah file ditulis sengan beberapa cara untuk mengenali elemen-elemen yang berbeda. Sebuah pendekatan yang lazim adalah menggunakan beberapa macam karakter untuk memisahkan potongan-potongan tunggal.
- Menggunakan metode String split( ) untuk memisahkan sebuah String menjadi sebuah kata tunggal. Sebuah String dengan salah satu pemisah akan mempunyai dua tanda, satu pada tiap sisi pemisah. Pemisah tidak dihitung sebagai sebuah kata / tanda.
Objek Serialisasi – JAVA
- Kita dapat menyimpan sebuah keadaan Objek dengan Menserialisasi Objek tersebut.
- Untuk Menserialisasi sebuah Objek, kita butuh sebuah ObjectOutputStream (dari java.io)
- Streams (Bahasa indonesianya : aliran) terbagi menjadi 2, yaitu Aliran Koneksi (Connection Streams) atau Aliran Berantai (Chain Streams).
- Connection Streams dapat digambarkan sebagai sebuah Koneksi ke sebuah sumber atau tujuan, khususnya sebuah file, koneksi jaringan soket, atau konsol.
- Chain Streams Tidak dapat menghubungkan ke sebuah sumber atau tujuan dan harus di dirantai ke sebuah aliran koneksi (atau lainnya).
- Untuk menserialisasikan sebuah Objek ke file, buat sebuah FileOutputStream dan rantaikan ia ke sebuah ObjectOutputStream.
- Untuk menserialisasikan sebuah Objek, panggil writeObject(objek) pada ObjectOutputStream. Kita tidak butuh memanggil method pada FileOutpurStream.
- Untuk menserialisasi, sebuah objek harus impelementasikan Interface Serializable. Jika sebuah superclass meng-implementasikan Serializable, subclass akan secara otomatis di Serialisasikan bahkan jika tidak diberikan implementasi Serializable.
- Ketika sebuah Objek diserialisasikan, Seluruh Grafik Objek akan diserialisasi. Yang berarti objek referensi dari instans variable objek yang diserialisasi manapun akan diserialisasikan.
- Jika beberapa objek di grafik tidak diserialisasi, sebuah exception (pengecualian) akan dijalankan pada saat program dieksekusi, kecuali instance variable yang mengacu ke objek dilewati.
- Tanda sebuah Instance Variable dengan kata kunci transient jika kita ingin proses serialisasi melewati / mengabaikan instance variable tsb. Variable akan diberikan niali null (untuk objek referensi) atau nilai default (untuk primitive).
- Selama Deserialisasi, class dari semua Objek-Objek di grafik Harus tersedia di JVM (Java Virtual Machine).
- Kita membaca objek di (menggunakan readObject() ) di dalam urutan ketika objek-objek tsb ditulis / dimasukkan ke JVM.
- Tipe kembalian (return) dari readObject() adalah tipe Objek, jadi Objek-objek deserialisasi harus melemparkannya ke tipe sebenarnya (int, string atau primitive lainnya).
- Variabel Static TIDAK DISERIALISASI! Tidak masuk akal untuk menyimpan sebuah nilai static variable dari keadaan objek yang spesifik, karena semua objek-objek yang diketik hanya membagi sebuah nilai tunggal.
RANGKUMAN TENTANG Layout Manager, Swing Component, GUI, BorderLayout, BoxLayout, FlowLayout — JAVA
- Layout Manager mengendalikan ukuran dan lokasi komponen-komponen yang berada di dalam komponen lainnya.
- Ketika kita menambahkan sebuah komponen ke komponen lainnya (kadang disebut sebagai komponen background, tapi itu bukanlah perbedaan teknis), Komponen yang ditambahkan dikendalikan oleh layout manager dari komponen Background.
- Sebuah Layout Manager meminta komponen-komponen untuk mengajukan ukurannya, sebelum membuat keputusan tentang layout. Tergantung pada kebijakan layout manager, mungkin saja diberlakukan ke semua, beberapa, atau (bahkan) tidak ada dari komponen tersebut.
- BorderLayout manager membiarkan kita menambahkan sebuah komponen ke salah satu dari lima wilayah. Kita harus menspesifikasikan wilayahnya ketika kita menambahkan sebuah komponen, menggunakan sintax berikut ; add(BorderLayout.EAST,panel);
- Dengan BorderLayout, komponen di Utara dan Selatan mendapatkan ukuran tinggi yang diajukan, tapi tidak pada lebarnya. Komponen di TImur dan Barat mendapatkan ukuran lebar yang diajukan, tapi tidak pada ukuran tingginya. Komponen di Center (Tengah) memperoleh apa saja yang tersisa (Kecuali kita menggunakan method pack( ) ).
- Method Pack ( ) adalah seperti menyusut-bungkus komponen-komponen; ia menggunakan ukuran penuh yang diajukan komponen center (Tengah), kemudian menentukan ukuran frame menggunakan center (Titik tengah) sebagai titik awal,mengguakan sisa dari space (tempat yang belum diisi) berdasarkan pada apa yang berada di dalam wilayah lainnya.
- FlowLayput menempatkan komponen dari kiri ke kanan, atas ke bawah, sesuai urutan saat mereka ditambahkan (add ( ) ) , berpindah ke sebuah baris baru komponen hanya ketika komponen tidak lagi muat secara horizontal.
- FlowLayout memberikan komponen-komponen ukuran yang mereka ajukan pada lebar dan tingginya.
- BoxLayout membiarkan kita meluruskan komponen-komponen yang bertumpuk secara vertical, bahkan jika mereka dapat muat saling menyamping. Seperi FlowLayout, BoxLayout menggunakan ukuran (tinggi dan lebar) yang diajukan oleh komponen.
- Border Layout adalah default layout manager untuk Frame; FlowLayout adalah default untuk Panel.
- Jika kita ingin sebuah Panel menggunakan sesuatu yang dari FlowLayout, Kita harus memanggil setLayout( ) pada Panel.
Rangkuman tentang Graphics – JAVA
- Kita dapat menggambar grafik 2D secara langsung di dalam widget.
- Kita dapat menggambar sebuah file bertipe .gif atau .jpeg secara langsung pada widget.
- Untuk menggambar grafik milikmu (termasuk sebuah .gif atau .jpeg), buatlah sebuah subclass JPanel dan mengganti “isi” dari method paintComponent ( ).
- Method paintComponent ( ) dipanggil oleh system GUI. Kita tidak bisa memanggilnya seperti method yang biasa. Argument pada method paintComponent ( ) asalah sebuah objek grafik yang memberikan kita sebuah permukaan untuk dijadikan tempat menggambar, yang dibatasi oleh layar/window. Kita tidak bisa sendiri membangun objek itu.
- Method-method khusus untuk memanggil sebuah objek Graphic (parameter paintComponent ) adalah : setColor (Color.blue); g.fillRect(20,50,100,120);
- Untuk menggambar sebuah .jpg, buatlah sebuah gambar menggunakan : Image image=new ImageIcon(“catzilla.jpg”).getImage( ); dan gambarlah menggunakan : drawImage(image,3,4,this);
- Objek direferensikan oleh parameter Graphics pada paintComponent ( ) sebenarnya sebuah instance dari class Graphics2D. Kelas Graphics2D mempunyai sebuah method yang beragam, termasuk : fill3DRect ( ), draw3DRect ( ), rotate(), scale(), shear (), transform ( ).
- Untuk meminta method-method Graphics2D, kita harus “melemparkan” parameter dari objek Graphics ke sebuah Objek Graphics2D : Graphics2D g2d= (Graphics2D) g; //g adalah referensi Objek Graphics
Rangkuman tentang EVENT – Java
- Untuk membuat sebuah GUI, mulai dengan sebuah Window, biasanya sebuah JFrame contoh : JFrame frame = new JFrame( );
- Kita bisa menambah widget (button (Tombol), text field (tempat menulis text), dll) ke JFrame dengan menggunakan; Contoh dalam menambahkan sebuah tombol (button) : getContentPane( ).add(button);
- Tidak seperti kebanyakan komponen lainnya, JFrame tidak membiarkan kita untuk menambahkannya (add) secara langsung, jadi KITA HARUS menambahkan (add) ke isi Jendela (Window).
- Untuk membuat window (JFrame) tampil, KITA HARUS memberikannya sebuah UKURAN (size) dan memberitahunya untuk KELIHATAN (Visible): contoh; setSize(300,300); frame.setVisible(true);
- Untuk mengetahui kapan user meng-klik sebuah button (tombol) (atau melakukan aksi lainnya pada antarmuka pengguna), maka KITA perlu mendengarka sebuah GUI Event.
- Untuk mendengarkan sebuah event, KITA HARUS mendaftarkan keinginan kita dengan sebuah Sumber Event. Sebuah Sumber Event adalah sesuatu (Button, CheckBox, dll) yang melepaskan sebuah EVENT berdasarkan interaksi pengguna.
- Listener (Pendengar) antarmuka memberikan Sumber Event sebuah cara untuk memanggil kita kembali, karena antarmuka (interface) mendefinisikan method(s) Sumber Event akan memanggil ketika sebuah Event terjadi.
- Untuk mendaftarkan untuk Event-Event dengan sebuah Sumber, panggil Method yang Didaftarkan milik Sumber. Method Registrasi selalu berbentuk : add<EventType>Listener Untuk mendaftarkan sebuah ActionEvent-nya Button (Tombol), contoh, addActionListener(this);
- Menjalankan antarmuka (interface) listener dengan menjalankan semua method-method Event-handling milik Interface. Letakkan Kode Event-Handling kita di dalam Method memanggil-kembali listener. Untuk ActionEvents, methodnya ialah; public void actionPerformed (ActionEvent event) { button.setText(“you clicked!”); }
- Objek Event dilewatkan ke dalam Method Event-Handler dengan membawa informasi tentang Event, termasuk sumber Event.
Rangkuman tentang Static – Final — JAVA
Berikut merupakan rangkuman dari Pembahasan Tipe STATIC dan FINAL, Just ENJOY it….. 🙂
- Sebuah Static Method menggunakan nama CLASSnya, bukan Variabel Referensi Objeknya. Contoh, Math.random( ) dan myFoo.go( ).
- Sebuah Static Method dapat dipanggil tanpa perlu Instance variable dari Class Method di dalam HEAP (ruang lingkup).
- Sebuah Static Method itu berguna untuk sebuah Method yang TIDAK BERGANTUNG pada nilai dari INSTANCE VARIABEL tertentu sebuah class.
- Sebuah Static Method tidak BERHUBUNGAN dengan Instance variable TERTENTU. Static Method HANYA berhubungan dengan CLASSnya. Jadi, Static Method tidak DAPAT mengakses INSTANCE VARIABEL dari dalam CLASSnya. INTINYA, STATIC METHOD tidak mengenal –tidak mengetahui nilai dari – INSTANCE VARIABEL.
- Sebuah Static Method tidak dapat DIHUBUNGKAN dengan NON-STATIC METHOD, karena NON-STATIC METHOD memiliki IKATAN (…ciecieJ) dengan nilai dari INSTANCE VARIABEL
- Jika kita memiliki CLASS yang HANYA berisi jenis STATIC METHOD, dan kita TIDAK ingin Class dibuat OBJEKnya, maka kita dapat MEMBERI tanda PRIVATE pada Constructornya.
- Static Variabel adalah Variabel yang MEMBAGI nilainya pada semua member yang DIBERIKAN oleh CLASS. HANYA ada satu SALINAN Static Variabel di dalam Class.
- Static Method DAPAT MENGAKSES Static Variabel.
- Untuk membuat nilai CONSTANT (dalam JAVA), kita dapat memberi tanda Static dan Final pada sebuah Variabel.
- Final Static Variabel HARUS diberikan nilai Awal (Inisialisasi) pada saat Deklarasi atau di dalam Static Initializer.
Static {DOG_CODE=42;}
- Pemberian NAMA untuk nilai CONSTANT (Variabel Final Static) HARUS menggunakan HURUF KAPITAL.
- Nilai dari Variabel Final hanya bisa DIGANTI SEKALI SAJA, yaitu pada saat INISIALISASI AWAL.
- Memberikan Nilai pada Instance Variabel Final adalah pada saat DEKLARASI atau didalam
CONSTRUCTOR. - FINAL METHOD Tidak Dapat di-OVERRide (diubah method dan Variabelnya).
- FINAL CLASS Tidak Dapat di-EXTENDS / Tidak Memiliki SUB-CLASS.
Rangkuman tentang Objek – Stack – Constructor – Variabel – Overload – Argumen —– JAVA
Rangkuman tentang Object dan Variabel di Tumpukan (Stack),
- Java memiliki dua area memori yang perlu kita tahu, yaitu Heap (Ruang Lingkup) dan Stack (Tumpukan).
- Instance Variable adalah Variabel yang dideklarasikan DIDALAM sebuah Class, tapi berada DILUAR method.
- Local Variabel adalah variable yang dideklarasikan DIDALAM method dan Variabel Parameter.
- Semua Local Variabel berada di (area Memori) Stack, satu Stack = satu Method yang memiliki sebuah Local Variabel.
- Variabel Referensi Objek bertindak seperti Variabel Primitif (cth, integer, String, dkk). Jika Variabel Referensi Objek dideklarasikan di dalam method, maka VRO akan dimasukkan ke area memori STACK.
- Sebuah Object akan berada di area memori Heap (Ruang Lingkup), apa referensinya berada di Local Variabel atau sebagai Instance Variable.
Rangkuman tentang Constructor – Variabel – Overload – Arguments
- Instance Variabel berada bersama Objectnya, yaitu di dalam Heap (Ruang Lingkup).
- Jika Instance variable adalah sebuah Referensi sebuah Objek, Referensi Variabel dan Objeknya akan berada di Area Memori HEAP (Ruang Lingkup).
- Sebuah Constructor adalah kode yang berjalan ketika kamu menulis new di dalam sebuah class.
- Sebuah Constructor HARUS mempunyai nama yang sama dengan CLASS (tempatnya berada), dan TIDAK BOLEH memiliki sebuah tipe RETURN (nilai kembalian – layaknya sebuah Method).
- Kita bisa menggunakan sebuah constructor untuk mengawali nilai / keadaaan variable (cth. Instance Variabel) sebuah Objek yang dibangun / dikonstruksi.
- Jika kita tidak meletakkan sebuah Constructor di dalam Class, maka Compiler akan meletakkan sebuah nilai default Constructor.
- Constructor Default seringkali sebuah Constructor tanpa argument / parameter.
- Jika kita meletakkan sebuah Constructor – Constructor apa saja – di dalam Class, maka Compiler TIDAK AKAN mem-BUILD / membuat Constructor Default.
- Jika kita ingin sebuah Constructor tanpa – argument, dan kita meletakkan sebuah Argumen di dalam Constructor, maka kita HARUS membangun / me-BUILD sendiri Constructor tanpa Argumen.
- Usahakan untuk selalu sediakan sebuah Constructor, untuk memudahkan programmer untuk membuat sebuah Objek. Jangan lupa berikan nilai default pada variabelnya.
- Constructor Overloaded (Beban Berlebih) berarti kita mempunyai lebih dari satu Constructor di dalam Class.
- Constructor Overload HARUS memiliki daftar argument yang BERBEDA.
- Kita TIDAK BISA mempunyai dua Constructor denga daftar Argumen yang SAMA. Sebuah Daftar Argumen DIPENGARUHI oleh URUTAN dan/atau TIPE Argumen.
- Instance Variabel menugaskan sebuah NILAI DEFAULT. NILAI DEFAULT adalah 0 / 0,0 / false untuk Tipe Primitif (Integer, String, dkk), dan NULL untuk Referensi (Objek).
Semoga Bermanfaat, my WP Reader…