Ada dua cara untuk membuat thread di Java: menggunakan kelas Thread dan menggunakan antarmuka Runnable. Saat menggunakan antarmuka Runnable, Anda perlu membuat instance Thread. Oleh karena itu, baik Anda membuat thread melalui kelas Thread atau antarmuka Runnable, Anda harus membuat instance kelas Thread atau subkelasnya. Konstruktor kelas Thread telah kelebihan beban sebanyak delapan kali. Konstruktornya adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
Utas publik( );
Thread publik (Target yang dapat dijalankan);
Thread publik (Nama string);
Thread publik (Target yang dapat dijalankan, nama String);
Thread publik (Grup ThreadGroup, Target yang dapat dijalankan);
Thread publik (grup ThreadGroup, nama String);
Thread publik (Grup ThreadGroup, Target yang dapat dijalankan, Nama string);
Thread publik (Grup ThreadGroup, Target yang dapat dijalankan, Nama string, ukuran tumpukan panjang);
Target yang bisa dijalankan
Sebuah instance dari kelas yang mengimplementasikan antarmuka Runnable. Perlu dicatat bahwa kelas Thread juga mengimplementasikan antarmuka Runnable, oleh karena itu, instance kelas yang diwarisi dari kelas Thread juga dapat diteruskan ke konstruktor ini sebagai target.
Nama tali
Nama utasnya. Nama ini dapat diatur melalui metode setName dari kelas Thread setelah membuat instance Thread. Jika nama thread tidak disetel, thread menggunakan nama thread default: Thread-N. N adalah urutan pembuatan thread dan merupakan bilangan bulat positif yang tidak berulang.
Grup Grup Utas
Grup thread tempat thread yang sedang dibuat berada. Jika tidak ada grup thread yang ditentukan, semua thread ditambahkan ke grup thread default. Detail tentang grup thread akan dibahas secara detail di bab selanjutnya.
ukuran tumpukan panjang
Ukuran tumpukan thread Nilai ini umumnya merupakan kelipatan bilangan bulat dari halaman CPU. Misalnya ukuran halaman x86 adalah 4KB. Pada platform x86, ukuran tumpukan thread default adalah 12KB.
Kelas Java biasa bisa menjadi kelas thread asalkan mewarisi dari kelas Thread. Dan kode thread dapat dieksekusi melalui metode awal dari kelas Thread. Meskipun subkelas dari kelas Thread dapat dipakai secara langsung, metode run dari kelas Thread harus ditimpa di subkelas agar benar-benar menjalankan kode thread. Kode berikut memberikan contoh penggunaan kelas Thread untuk membuat thread:
Copy kode kodenya sebagai berikut:
paket mitos;
kelas publik Thread1 memperluas Thread
{
menjalankan kekosongan publik()
{
Sistem.keluar.println(ini.getName());
}
public static void main(String[] args)
{
System.out.println(Thread.currentThread().getName());
Utas1 utas1 = Utas1 baru();
Thread1 thread2 = Thread1 baru();
thread1.mulai();
thread2.mulai();
}
}
Kode di atas membuat dua thread: thread1 dan thread2. Baris 005 hingga 005 pada kode di atas adalah metode run dari kelas Thread1. Ketika metode start dipanggil pada baris 014 dan 015, sistem secara otomatis memanggil metode run. Pada baris 007, this.getName() digunakan untuk menampilkan nama thread saat ini. Karena nama thread tidak ditentukan saat thread dibuat, maka output nama thread adalah nilai default sistem, yang berbentuk Thread. -N. Nama thread dari thread utama adalah output pada baris 011.
Hasil dari menjalankan kode di atas adalah sebagai berikut:
utama
Utas-0
Utas-1
Seperti dapat dilihat dari keluaran di atas, keluaran utama pada baris pertama adalah nama thread utama. Thread-1 dan Thread-2 berikut ini masing-masing merupakan hasil keluaran dari thread1 dan thread2.
Catatan: Setiap program Java harus memiliki thread utama. Umumnya nama thread utama ini adalah main. Hanya dengan membuat thread tambahan di dalam program, program tersebut dapat dianggap sebagai program multi-thread yang sebenarnya. Dengan kata lain, program multi-threaded harus memiliki lebih dari satu thread.
Kelas Thread memiliki konstruktor yang kelebihan beban untuk menyetel nama thread. Selain menggunakan metode konstruktor untuk menyetel nama thread saat membuat thread, Anda juga dapat menggunakan metode setName dari kelas Thread untuk mengubah nama thread. Untuk menyetel nama thread melalui konstruktor kelas Thread, Anda harus menggunakan konstruktor Thread(nama string) publik dari kelas Thread di subkelas Thread. Oleh karena itu, Anda juga harus menambahkan thread untuk meneruskan subkelas Thread. Konstruktor nama. Kode berikut memberikan contoh pengaturan nama thread:
Copy kode kodenya sebagai berikut:
paket mitos;
kelas publik Thread2 memperluas Thread
{
String pribadi siapa;
menjalankan kekosongan publik()
{
System.out.println(siapa + ":" + ini.getName());
}
Thread2 publik(String siapa)
{
super();
ini.siapa = siapa;
}
Thread2 publik (String siapa, Nama string)
{
super(nama);
ini.siapa = siapa;
}
public static void main(String[] args)
{
Thread2 thread1 = Thread2 baru ("thread1", "MyThread1");
Thread2 thread2 = Thread2 baru ("thread2");
Thread2 thread3 = Thread2 baru ("thread3");
thread2.setName("Benang Saya2");
thread1.mulai();
thread2.mulai();
thread3.mulai();
}
Ada dua konstruktor di kelas:
Baris 011: sampel publik2_2(String siapa)
Konstruktor ini memiliki satu parameter: siapa. Parameter ini digunakan untuk mengidentifikasi thread yang sedang dibuat. Konstruktor default thread public Thread() masih dipanggil di konstruktor ini.
Baris 016: public sample2_2(String siapa, nama String)
Who pada konstruktor ini memiliki arti yang sama dengan who pada konstruktor pertama, dan parameter name adalah nama thread. Dalam konstruktor ini, konstruktor Thread(String name) publik dari kelas Thread dipanggil, yaitu super(name) pada baris 018.
Tiga thread dibuat dalam metode utama: thread1, thread2 dan thread3. Diantaranya, thread1 menetapkan nama thread melalui metode konstruksi, thread2 mengubah nama thread melalui metode setName, dan thread3 tidak menetapkan nama thread.
Hasil yang berjalan adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
thread1:Benang Saya1
thread2:Benang Saya2
utas3:Utas-1
Seperti terlihat pada output di atas, nama thread thread1 dan thread2 telah diubah, sedangkan nama thread thread3 masih nilai default: Thread-1. Alasan mengapa nama thread dari thread3 bukan Thread-2 tetapi Thread-1 adalah karena nama thread2 telah ditentukan pada baris 026. Oleh karena itu, ketika thread3 dimulai, nama thread dari thread3 disetel ke Thread-1. Jadi Anda akan mendapatkan output di atas.
Catatan: Anda dapat menggunakan setName untuk menyetel nama thread sebelum dan sesudah memanggil metode start. Namun, menggunakan setName untuk mengubah nama thread setelah memanggil metode start akan menyebabkan ketidakpastian, yang berarti setName tidak dapat dijalankan hingga metode run selesai. dieksekusi. Jika ingin menggunakan nama thread pada metode run, akan terjadi fenomena meskipun metode setName dipanggil, namun nama thread tidak diubah.
Metode awal dari kelas Thread tidak dapat dipanggil berkali-kali. Misalnya, metode thread1.start() tidak dapat dipanggil dua kali. Jika tidak, IllegalThreadStateException akan dilempar.