"Halo, Amigo! Ellie memberi tahu Anda tentang utas, dan saya akan memberi tahu Anda cara Anda bekerja dengannya. Untuk membuat utas baru, Anda perlu:"

1)  Buat objek Utas

2) Berikan metode yang ingin Anda jalankan

3)  Panggil metode start pada objek Thread yang dibuat.

Pertimbangkan contoh ini:

Kode Keterangan
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
Kelas yang mengimplementasikan antarmuka Runnable .
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 Buat instance dari kelas Printer, yang mengimplementasikan metode jalankan.
2 Buat objek Thread baru. Kami meneruskan konstruktor objek printer, yang metode run()-nya perlu dipanggil.
3 Mulai thread baru dengan memanggil metode start() .

Program Java kecil biasanya terdiri dari satu utas yang disebut «utas utama». Tetapi program lebih sering meluncurkan utas tambahan, yang disebut «utas anak». Utas utama menjalankan metode utama dan berakhir. Metode run dari Runnable adalah metode analog untuk utas anak.

"Ah, banyak utas berarti banyak metode utama."

Membuat dan memulai utas baru - 1

Untuk memberi tahu objek Thread metode spesifik mana yang harus dimulai, kita perlu meneruskan metode ke objek tersebut. Di Java, ini dilakukan dengan menggunakan antarmuka Runnable . Antarmuka ini berisi metode abstrak tunggal: void run() . Kelas Thread memiliki konstruktor Thread(Runnable Runnable) . Anda dapat meneruskan objek apa pun yang mengimplementasikan antarmuka Runnable .

Kelas Anda harus mewarisi Runnable dan mengganti metode run -nya . Memanggil metode ini adalah yang memulai utas baru. Anda dapat menulis apa pun yang Anda inginkan dalam metode run .

Kode Keterangan
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Kelas yang mengimplementasikan antarmuka Runnable.
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
Buat dua utas, yang masing-masing akan didasarkan pada objek Printernya sendiri.
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
Buat tiga utas berdasarkan satu objek Printer.

Terlebih lagi, Anda dapat menggabungkan semua ini menjadi satu kelas. Kelas Thread mewarisi Runnable interface , jadi Anda hanya perlu mengganti metode run -nya :

Cara lain untuk membuat utas baru
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
Mewarisi kelas Thread , yang mengimplementasikan antarmuka Runnable , lalu mengganti metode run .
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
Buat dua utas, yang masing-masing akan didasarkan pada objek Printernya sendiri .

"Ini solusi yang lebih elegan."

"Ya, tapi ada kekurangannya:"

1)  Anda mungkin perlu memulai beberapa utas berdasarkan satu objek, seperti pada contoh dengan Natasha.

2)  Jika Anda mewarisi dari kelas Thread, Anda tidak dapat menambahkan kelas induk lain ke kelas Anda.

3)  Jika kelas Anda memiliki kelas induk, Anda tidak dapat menambahkan Thread sebagai kelas induk kedua.

"Dengan kata lain, setelah metode start dipanggil, masing-masing utas mulai menjalankan metode run dari objek yang diteruskan ke konstruktor?"

"Ya. Jika tidak ada yang diteruskan ke konstruktor, maka Thread akan menjalankan metode run internalnya."

"Tapi kenapa kita tidak memanggil metode seperti ini saja?"

Kode
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

"Ketika utas utama mencapai metode jalankan , "robot kecilnya" hanya masuk ke dalam dan mengeksekusi semua perintah di dalamnya. Hanya setelah dieksekusi, ia akan kembali ke metode utama dan melanjutkan eksekusi perintah lebih lanjut. Jadi, tidak ada detik " robot kecil" akan dibuat. Semua pekerjaan akan dilakukan secara berurutan, tidak secara paralel (bersamaan)."

"Begitu. Bisakah kamu memanggil metode lain, sesuatu selain lari?"

"Tidak. Itu semua terkait dengan antarmuka Runnable, yang hanya "tahu" tentang salah satu metodenya: run() ."