Difference between revisions of "JAVA: start() function di multithreading"
Onnowpurbo (talk | contribs) |
Onnowpurbo (talk | contribs) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | Kami telah membahas bahwa thread Java biasanya dibuat menggunakan salah satu dari dua (2) metode: | |
− | * | + | * Extend thread class. |
− | * | + | * Implement Runnable |
− | + | Dalam kedua pendekatan tersebut, kita override/menimpa fungsi run(), tetapi kita memulai sebuah thread dengan memanggil fungsi start(). Jadi mengapa kita tidak langsung memanggil fungsi run() yang ditimpa? Mengapa selalu fungsi start dipanggil untuk mengeksekusi thread? | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Dalam kedua pendekatan tersebut, kita menimpa fungsi run(), tetapi kita memulai sebuah thread dengan memanggil fungsi start(). Jadi mengapa kita tidak langsung memanggil fungsi run() yang ditimpa? Mengapa selalu fungsi start dipanggil untuk mengeksekusi | ||
Apa yang terjadi jika suatu fungsi dipanggil? | Apa yang terjadi jika suatu fungsi dipanggil? | ||
Ketika suatu fungsi dipanggil, operasi berikut terjadi: | Ketika suatu fungsi dipanggil, operasi berikut terjadi: | ||
* Argumen dievaluasi. | * Argumen dievaluasi. | ||
− | * | + | * frame stack baru didorong ke stack panggilan. |
* Parameter diinisialisasi. | * Parameter diinisialisasi. | ||
− | * Tubuh | + | * Tubuh method dieksekusi. |
− | * Nilai dikembalikan dan | + | * Nilai dikembalikan dan frame stack saat ini di pop dari call stack. |
− | Tujuan dari start() adalah untuk membuat | + | Tujuan dari start() adalah untuk membuat call stack terpisah untuk thread. Call Stack terpisah dibuat olehnya, dan kemudian run() dipanggil oleh JVM. |
Mari kita lihat apa yang terjadi jika kita tidak memanggil start() dan memanggil run() secara langsung. Kami telah memodifikasi program pertama yang dibahas di sini. | Mari kita lihat apa yang terjadi jika kita tidak memanggil start() dan memanggil run() secara langsung. Kami telah memodifikasi program pertama yang dibahas di sini. | ||
Line 92: | Line 70: | ||
Thread 1 is running | Thread 1 is running | ||
− | + | Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua thread karena kita telah memanggil run() secara langsung. Program yang memanggil start() mencetak id yang berbeda | |
− | |||
− | |||
− | Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua | ||
− | |||
Latest revision as of 11:09, 15 May 2022
Kami telah membahas bahwa thread Java biasanya dibuat menggunakan salah satu dari dua (2) metode:
- Extend thread class.
- Implement Runnable
Dalam kedua pendekatan tersebut, kita override/menimpa fungsi run(), tetapi kita memulai sebuah thread dengan memanggil fungsi start(). Jadi mengapa kita tidak langsung memanggil fungsi run() yang ditimpa? Mengapa selalu fungsi start dipanggil untuk mengeksekusi thread?
Apa yang terjadi jika suatu fungsi dipanggil? Ketika suatu fungsi dipanggil, operasi berikut terjadi:
- Argumen dievaluasi.
- frame stack baru didorong ke stack panggilan.
- Parameter diinisialisasi.
- Tubuh method dieksekusi.
- Nilai dikembalikan dan frame stack saat ini di pop dari call stack.
Tujuan dari start() adalah untuk membuat call stack terpisah untuk thread. Call Stack terpisah dibuat olehnya, dan kemudian run() dipanggil oleh JVM.
Mari kita lihat apa yang terjadi jika kita tidak memanggil start() dan memanggil run() secara langsung. Kami telah memodifikasi program pertama yang dibahas di sini.
// Java code to see that all threads are // pushed on same stack if we use run() // instead of start(). class ThreadTest extends Thread { public void run() { try { // Displaying the thread that is running System.out.println ("Thread " + Thread.currentThread().getId() + " is running"); } catch (Exception e) { // Throwing an exception System.out.println ("Exception is caught"); } } } // Main Class public class Main { public static void main(String[] args) { int n = 8; for (int i=0; i<n; i++) { ThreadTest object = new ThreadTest(); // start() is replaced with run() for // seeing the purpose of start object.run(); } } }
Output:
Thread 1 is running Thread 1 is running Thread 1 is running Thread 1 is running Thread 1 is running Thread 1 is running Thread 1 is running Thread 1 is running
Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua thread karena kita telah memanggil run() secara langsung. Program yang memanggil start() mencetak id yang berbeda