1. Konsep Thread: Thread mengacu pada aliran eksekusi suatu tugas dari awal hingga akhir. Utas menyediakan mekanisme untuk menjalankan tugas. Untuk Java, beberapa utas dapat dieksekusi secara bersamaan dalam suatu program, dan utas ini dapat berjalan secara bersamaan pada sistem multiprosesor. Ketika program berjalan sebagai aplikasi, juru bahasa Java memulai utas untuk metode utama ().
2. Paralel dan Konkurensi:
(1) Concurrency: Dalam satu sistem prosesor, beberapa utas berbagi waktu CPU, dan sistem operasi bertanggung jawab untuk menjadwalkan dan mengalokasikan sumber daya kepada mereka.
(2) Paralelisme: Dalam sistem multiprosesor, beberapa prosesor dapat menjalankan beberapa utas secara bersamaan. Utas ini dapat berjalan secara bersamaan secara bersamaan. Tidak seperti konkurensi, hanya beberapa utas yang dapat berbagi waktu CPU, dan hanya satu utas yang dapat berjalan pada saat yang sama.
3. Penciptaan utas:
(1) Konsep Dasar: Setiap tugas di Java adalah objek yang dapat dijalankan. Untuk membuat tugas, kelas tugas harus terlebih dahulu didefinisikan, dan kelas tugas harus mengimplementasikan antarmuka Runnable. Dan utas pada dasarnya adalah objek yang nyaman untuk dieksekusi tugas. Proses eksekusi utas adalah eksekusi metode run () di kelas tugas sampai akhir.
(2) Buat utas melalui antarmuka runnable:
A. Tentukan kelas tugas untuk mengimplementasikan antarmuka runnable, mengimplementasikan metode run () di metode Runnable Interface (run () memberi tahu utas sistem cara menjalankan), dan menentukan kode tugas tertentu atau logika pemrosesan dalam metode run ().
B. Setelah mendefinisikan kelas tugas, buat objek tugas untuk kelas tugas.
C. Tugas harus dieksekusi di utas, membuat objek kelas tapak, dan lulus objek kelas tugas yang dibuat sebelumnya yang mengimplementasikan antarmuka yang dapat dijalankan ke konstruktor kelas tapak sebagai parameter.
D. Hubungi metode start () dari objek kelas tapak dan mulai utas. Itu menyebabkan metode tugas run () dieksekusi. Ketika metode run () dieksekusi, utas akan berakhir.
Contoh kode:
Paket com.muzeet.mutithread; // Setiap tugas adalah instance dari antarmuka yang dapat dijalankan. Tugasnya adalah objek yang dapat dilalui, dan utas adalah objek yang memfasilitasi pelaksanaan tugas. Anda harus membuat kelas tugas dan mengganti metode run untuk menentukan tugas Public Class ThreadDemo1 mengimplementasikan runnable {private int countdown = 10; @Override // Tulis ulang metode run dan tentukan tugas public void run () {while (Countdown--> 0) {System.out.println ("$" + thread.currentThread (). GetName () + "(" + Countdown + ")"); }} // Memanggil metode start akan memulai utas, menyebabkan metode run dalam tugas dipanggil. Setelah metode RUN dieksekusi, utas mengakhiri public static void main (string [] args) {runnable demo1 = new threadDemo1 (); Thread thread1 = utas baru (demo1); Thread thread2 = utas baru (demo1); thread1.start (); thread2.start (); System.out.println ("Rocket Launch Countdown:"); }}Hasil menjalankan program:
Rocket Launch Countdown: $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ Thread-0 (5) $ Thread-0 (4) $ Thread-0 (3) $ Thread-0 (2) $ Thread-0 (1) $ Thread-0 (0)
Jalankan dua objek tugas secara bersamaan:
public static void main (string [] args) {runnable demo1 = new threadDemo1 (); Runnable demo2 = new threadDemo1 (); Thread thread1 = utas baru (demo1); Thread thread2 = utas baru (demo2); thread1.start (); thread2.start (); System.out.println ("Rocket Launch Countdown:"); }Hasil Menjalankan:
Countdown Peluncuran Roket: $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ Thread-1 (9) $ Thread-0 (5) $ Thread-1 (8) $ Thread-0 (4) $ Thread-1 (7) $ Thread-0 (3) $ Thread-1 (6) $ thread-1 (5) $ thread-0 (2) $ thread-1 (4) $ thread-1 (3) $ thread-1 (2) $ thread-1 (1) $ thread-1 (0) $ thread-0 (1) $ thread-0 (0)
(3) mewarisi kelas utas untuk membuat utas:
A. Pertama -tama buat kelas tugas memperluas kelas utas. Karena kelas utas mengimplementasikan antarmuka Runnable, kelas tugas yang disesuaikan juga mengimplementasikan metode Runnable Interface dan Rerun (), yang mendefinisikan kode tugas tertentu atau pemrosesan logika.
B. Buat objek kelas tugas, yang dapat menggunakan utas atau dapat dijalankan sebagai jenis variabel khusus.
C. Hubungi metode start () dari objek kustom dan mulai utas.
Kode contoh:
Paket com.muzeet.mutithread; // Setiap tugas adalah instance dari antarmuka yang dapat dijalankan. Tugasnya adalah objek yang dapat dijalankan, dan utas dapat menjalankan objek. Kelas tugas harus dibuat, dan metode run harus diganti untuk menentukan tugas kelas publik ExtendFromThread memperluas thread {private int countdown = 10; @Override // Tulis ulang metode run dan tentukan tugas public void run () {while (Countdown--> 0) {System.out.println ("$" + this.getName () + "(" + Countdown + ")"); }} // Memanggil metode start akan memulai utas, menyebabkan metode run dalam tugas dipanggil. Setelah metode run dijalankan, utas mengakhiri public static void main (string [] args) {extentFromThread thread1 = new ExtandFromThread (); ExtandFromThread thread2 = ExtandFromThread baru (); thread1.start (); thread2.start (); System.out.println ("Rocket Launch Countdown:"); }}Hasil Menjalankan:
Countdown Peluncuran Roket: $ Thread-0 (9) $ Thread-0 (8) $ Thread-0 (7) $ Thread-0 (6) $ Thread-0 (5) $ Thread-0 (4) $ Thread-0 (3) $ Thread-0 (2) $ Thread-0 (1) $ Thread-0 (0) $ Thread-1 (9) $ thread-1 (8) $ thread-1 (7) $ thread-1 (6) $ thread-1 (5) $ thread-1 (4) $ thread-1 (3) $ thread-1 (2) $ thread-1 (1) $ thread-1 (0)
Satu utas menunggu utas lain untuk diakhiri sebelum dieksekusi: Saat menjalankan tugas printnum, saat mencetak nomor 50, ia berubah untuk melaksanakan tugas mencetak karakter C, dan hanya kemudian terus melaksanakan tugas mencetak nomor setelah Thread Thread4 telah dieksekusi.
paket com.muzeet.testthread; kelas publik printnum mengimplementasikan runnable {private int lastnum; printnum publik (int n) {lastnum = n; } @Override public void run () {// TODO METODE AUTO-DEPTIRET PUTPAt Thread4 = Thread baru (printChar baru ('C', 40)); thread4.start (); coba {untuk (int i = 1; i <= lastnum; i ++) {System.out.println (""+i); if (i == 50) {thread4.join (); }}} catch (InterruptedException E) {// TODO Auto-Enchoerated Catch Block E.PrintStackTrace (); }}}4. Perbandingan kedua metode (dicetak ulang)
Pertama, kami menganalisis hasil output dari kedua metode tersebut. Kami juga membuat dua utas. Mengapa hasilnya berbeda?
Menggunakan antarmuka runnable untuk membuat utas, Anda dapat berbagi objek target yang sama (treadDemo1tt = newTreadDemo1 ();), menerapkan beberapa utas identik untuk memproses sumber daya yang sama. Ketika utas pertama menyelesaikan tugas, Countdown sudah 0, jadi utas kedua tidak akan output. Mewarisi metode membuat utas berdasarkan utas, dua objek kelas tugas dibuat, dengan variabel anggota masing -masing, dan mereka tidak saling mengganggu.
Kemudian lihat penjelasan dari JDK:
Antarmuka runnable harus diimplementasikan oleh kelas yang bermaksud untuk menjalankan instance mereka melalui utas tertentu. Kelas harus mendefinisikan metode tanpa parameter yang disebut run.
Tujuan merancang antarmuka ini adalah untuk memberikan protokol publik untuk objek yang ingin menjalankan kode saat aktif. Misalnya, kelas utas mengimplementasikan runnable. Aktivasi berarti bahwa utas telah dimulai dan belum berhenti.
Selain itu, Runnable menyediakan metode aktivasi untuk kelas yang bukan subkelas utas. Dengan instantiasi instance utas dan menganggap dirinya sebagai target berjalan, Anda dapat menjalankan kelas yang mengimplementasikan Runnable. Dalam kebanyakan kasus, jika Anda ingin mengesampingkan metode run () dan tidak mengganti metode utas lainnya, Anda harus menggunakan antarmuka runnable. Ini penting karena kecuali programmer bermaksud untuk memodifikasi atau meningkatkan perilaku dasar suatu kelas, suatu subkelas tidak boleh dibuat untuk kelas itu. (Disarankan untuk menggunakan pembuatan kelas tugas dan mengimplementasikan antarmuka runnable alih -alih mewarisi kelas utas)
Mengadopsi warisan kelas utas:
(1) Keuntungan: Mudah ditulis. Jika Anda perlu mengakses utas saat ini, Anda tidak perlu menggunakan metode thread.currentThread (). Anda bisa mendapatkan utas saat ini secara langsung menggunakan ini.
(2) Kekurangan: Karena kelas utas telah mewarisi kelas utas, tidak dapat mewarisi kelas orang tua lainnya.
Menggunakan metode antarmuka runnable:
(1) Keuntungan: Kelas utas hanya mengimplementasikan antarmuka yang dapat dijalankan dan juga dapat mewarisi kelas lain. Dengan cara ini, beberapa utas dapat berbagi objek target yang sama, sehingga sangat cocok untuk beberapa utas identik untuk menangani sumber daya yang sama, sehingga kode dan data CPU dapat dipisahkan untuk membentuk model yang jelas, yang lebih mencerminkan ide yang berorientasi objek.
(2) Kekurangan: Pemrograman sedikit rumit. Jika Anda perlu mengakses utas saat ini, Anda harus menggunakan metode thread.currentThread ().
Meringkaskan
Di atas adalah semua tentang dua cara untuk membuat utas dalam java multithreading dan contoh kode komparatif. Saya harap ini akan membantu semua orang. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!