Difference between revisions of "JAVA: start() function di multithreading"

From OnnoWiki
Jump to navigation Jump to search
Line 2: Line 2:
 
* Extending thread class.
 
* Extending thread class.
 
* Implementing Runnable
 
* Implementing Runnable
 +
 +
Kami telah membahas bahwa utas Java biasanya dibuat menggunakan salah satu dari dua metode:
 +
* Memperluas kelas benang.
 +
* Menerapkan Runnable
 +
 +
  
 
In both the approaches, we override the run() function, but we start a thread by calling the start() function. So why don’t we directly call the overridden run() function? Why always the start function is called to execute a thread?
 
In both the approaches, we override the run() function, but we start a thread by calling the start() function. So why don’t we directly call the overridden run() function? Why always the start function is called to execute a 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 utas?
 +
  
 
What happens when a function is called?  
 
What happens when a function is called?  
Line 12: Line 21:
 
* Method body is executed.
 
* Method body is executed.
 
* Value is returned and current stack frame is popped from the call stack.
 
* Value is returned and current stack frame is popped from the call stack.
 
The purpose of start() is to create a separate call stack for the thread. A separate call stack is created by it, and then run() is called by JVM.
 
 
Let us see what happens if we don’t call start() and rather call run() directly. We have modified the first program discussed here.
 
 
 
 
 
 
Kami telah membahas bahwa utas Java biasanya dibuat menggunakan salah satu dari dua metode:
 
* Memperluas kelas benang.
 
* Menerapkan Runnable
 
 
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 utas?
 
  
 
Apa yang terjadi jika suatu fungsi dipanggil?
 
Apa yang terjadi jika suatu fungsi dipanggil?
Line 34: Line 29:
 
* Tubuh metode dieksekusi.
 
* Tubuh metode dieksekusi.
 
* Nilai dikembalikan dan bingkai tumpukan saat ini muncul dari tumpukan panggilan.
 
* Nilai dikembalikan dan bingkai tumpukan saat ini muncul dari tumpukan panggilan.
 +
 +
 +
The purpose of start() is to create a separate call stack for the thread. A separate call stack is created by it, and then run() is called by JVM.
  
 
Tujuan dari start() adalah untuk membuat tumpukan panggilan terpisah untuk utas. Tumpukan panggilan terpisah dibuat olehnya, dan kemudian run() dipanggil oleh JVM.
 
Tujuan dari start() adalah untuk membuat tumpukan panggilan terpisah untuk utas. Tumpukan panggilan terpisah dibuat olehnya, dan kemudian run() dipanggil oleh JVM.
 +
 +
 +
Let us see what happens if we don’t call start() and rather call run() directly. We have modified the first program discussed here.
  
 
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 93: Line 94:
  
 
We can see from above output that we get same ids for all threads because we have directly called run(). The program that calls start() prints different ids (see this)
 
We can see from above output that we get same ids for all threads because we have directly called run(). The program that calls start() prints different ids (see this)
 
  
 
Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua utas karena kita telah memanggil run() secara langsung. Program yang memanggil start() mencetak id yang berbeda (lihat ini)
 
Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua utas karena kita telah memanggil run() secara langsung. Program yang memanggil start() mencetak id yang berbeda (lihat ini)

Revision as of 11:03, 15 May 2022

We have discussed that Java threads are typically created using one of the two methods :

  • Extending thread class.
  • Implementing Runnable

Kami telah membahas bahwa utas Java biasanya dibuat menggunakan salah satu dari dua metode:

  • Memperluas kelas benang.
  • Menerapkan Runnable


In both the approaches, we override the run() function, but we start a thread by calling the start() function. So why don’t we directly call the overridden run() function? Why always the start function is called to execute a 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 utas?


What happens when a function is called? When a function is called the following operations take place:

  • The arguments are evaluated.
  • A new stack frame is pushed into the call stack.
  • Parameters are initialized.
  • Method body is executed.
  • Value is returned and current stack frame is popped from the call stack.

Apa yang terjadi jika suatu fungsi dipanggil? Ketika suatu fungsi dipanggil, operasi berikut terjadi:

  • Argumen dievaluasi.
  • Bingkai tumpukan baru didorong ke tumpukan panggilan.
  • Parameter diinisialisasi.
  • Tubuh metode dieksekusi.
  • Nilai dikembalikan dan bingkai tumpukan saat ini muncul dari tumpukan panggilan.


The purpose of start() is to create a separate call stack for the thread. A separate call stack is created by it, and then run() is called by JVM.

Tujuan dari start() adalah untuk membuat tumpukan panggilan terpisah untuk utas. Tumpukan panggilan terpisah dibuat olehnya, dan kemudian run() dipanggil oleh JVM.


Let us see what happens if we don’t call start() and rather call run() directly. We have modified the first program discussed here.

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

We can see from above output that we get same ids for all threads because we have directly called run(). The program that calls start() prints different ids (see this)

Kita dapat melihat dari output di atas bahwa kita mendapatkan id yang sama untuk semua utas karena kita telah memanggil run() secara langsung. Program yang memanggil start() mencetak id yang berbeda (lihat ini)


Referensi