Rumah  >  Artikel  >  Java  >  Apakah cara untuk melaksanakan multithreading di Jawa?

Apakah cara untuk melaksanakan multithreading di Jawa?

WBOY
WBOYke hadapan
2023-05-18 12:55:112556semak imbas

Kata Pengantar

Terdapat empat cara utama untuk melaksanakan Java multi-threading:

① Warisi kelas Thread dan laksanakan antara muka Runnable

② Laksanakan antara muka Boleh Panggil dan ciptakannya melalui benang Benang pembalut FutureTask

③ Gunakan ExecutorService, Callable

④ Masa depan untuk melaksanakan multi-threading dengan hasil pulangan

Dua kaedah pertama tidak mengembalikan nilai selepas benang dilaksanakan, dan dua kaedah terakhir Jenis ini mempunyai nilai pulangan.

1. Empat cara untuk melaksanakan multi-threading

1 Warisi kelas Thread untuk mencipta thread

Kelas Thread pada asasnya adalah contoh yang melaksanakan antara muka Runnable, yang mewakili contoh benang. Menggunakan kaedah instance start() kelas Thread ialah satu-satunya cara untuk memulakan thread. Benang baharu yang melaksanakan kaedah run() dimulakan dengan memanggil kaedah start(), iaitu kaedah asli. Ia adalah sangat mudah untuk melaksanakan multi-benang dengan cara ini Dengan terus melanjutkan Thread melalui kelas anda sendiri dan mengatasi kaedah run(), anda boleh memulakan thread baru dan melaksanakan kaedah run() anda sendiri. Contohnya:

public class MyThread extends Thread {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}  
MyThread myThread1 = new MyThread();  
MyThread myThread2 = new MyThread();  
myThread1.start();  
myThread2.start();

2 Laksanakan antara muka Runnable untuk mencipta utas

Jika kelas anda telah melanjutkan kelas lain, anda tidak boleh melanjutkan Thread secara langsung pada masa ini, anda boleh melaksanakan antara muka Runnable , seperti berikut:

public class MyThread extends OtherClass implements Runnable {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}

Untuk memulakan MyThread, anda perlu membuat instantiate Thread terlebih dahulu dan lulus dalam contoh MyThread anda sendiri:

MyThread myThread = new MyThread();  
Thread thread = new Thread(myThread);  
thread.start();

Malah, apabila parameter sasaran Runnable dihantar ke Thread, kaedah run( ) Thread akan memanggil target.run(), rujuk kod sumber JDK:

public void run() {  
  if (target != null) {  
   target.run();  
  }  
}

3 Laksanakan antara muka Boleh Panggil

Buat utas Thread melalui pembungkus FutureTask <. . benang yang mengembalikan hasil>

ExecutorService, Tiga antara muka Boleh Panggil dan Masa Depan sebenarnya tergolong dalam rangka kerja Pelaksana. Dalam JDK1.5, urutan yang mengembalikan hasil diperkenalkan sebagai ciri baharu, jadi anda tidak perlu lagi menghadapi masalah untuk mendapatkan nilai pulangan. Dan walaupun anda melaksanakannya sendiri, ia mungkin penuh dengan kelemahan.

Tugas yang boleh mengembalikan nilai mesti melaksanakan antara muka Boleh Panggil. Begitu juga, tugas yang tidak mengembalikan nilai mesti melaksanakan antara muka Runnable.

Selepas melaksanakan tugas Boleh Panggil, anda boleh mendapatkan objek Masa Depan Dengan memanggil dapatkan pada objek, anda boleh mendapatkan Objek yang dikembalikan oleh tugas Boleh Panggil.

Nota: Kaedah get disekat, iaitu: benang tidak mengembalikan hasil dan kaedah get akan menunggu selama-lamanya.

Digabungkan dengan antara muka kolam benang ExecutorService, anda boleh merealisasikan pelbagai benang lagenda yang mengembalikan hasil.

Ia telah disahkan di bawah JDK1.5 dan tiada masalah Anda boleh terus menggunakan contoh ujian berbilang benang dengan keputusan yang dikembalikan disediakan di bawah. Kodnya adalah seperti berikut:

public interface Callable<V>   { 
  V call() throws Exception;   } 
public class SomeCallable<V> extends OtherClass implements Callable<V> {
    @Override
    public V call() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

2. Pengetahuan berkaitan multi-threading

1 Perbezaan antara Runnable dan Callable

Perbezaan utama ialah kaedah larian bagi Antara muka Runnable tidak mempunyai nilai pulangan;

Kaedah panggilan antara muka Boleh Panggil mempunyai nilai pulangan dan menyokong antara muka Runnable generik Kaedah run hanya boleh membuang pengecualian masa jalan dan tidak boleh ditangkap dan diproses;

Kaedah panggilan antara muka Boleh Panggil membolehkan pengecualian melontar dan anda boleh mendapatkan maklumat pengecualian

2 Cara memulakan urutan baharu dan perbezaan antara memanggil kaedah mula dan jalankan

Memanggil kekunci. kaedah jalankan pada objek benang tidak memulakan benang. Hanya kaedah panggilan objek.

Panggilan objek utas mula membuka utas, dan membenarkan jvm memanggil kaedah jalankan untuk melaksanakan dalam utas yang dibuka, Memanggil kaedah mula boleh memulakan utas dan membuat utas memasuki keadaan sedia, dan kaedah run hanyalah kaedah benang biasa, atau Dilaksanakan dalam utas utama.

3. Kaedah asas berkaitan benang

Kaedah asas berkaitan benang termasuk tunggu, maklumkan, maklumkanSemua, tidur, sertai, hasil, dsb.

Tunggu benang (tunggu ) memanggil ini Benang kaedah memasuki keadaan menunggu dan hanya akan kembali jika ia menunggu pemberitahuan daripada utas lain atau terganggu Perlu diingat bahawa selepas memanggil kaedah tunggu(), kunci objek akan dilepaskan. Oleh itu, kaedah tunggu biasanya digunakan dalam kaedah disegerakkan atau blok kod disegerakkan.

Tidur benang (tidur) menyebabkan utas semasa tidur Tidak seperti kaedah tunggu, tidur tidak akan melepaskan kunci tidur yang sedang diduduki (lama) akan menyebabkan benang memasuki keadaan WATING MASA kaedah wait() Akan menyebabkan utas semasa memasuki keadaan WATING

Hasil benang (hasil) akan menyebabkan utas semasa melepaskan potongan masa pelaksanaan CPU dan bersaing dengan utas lain untuk masa CPU. hiris lagi. Secara umumnya, benang dengan keutamaan tinggi mempunyai peluang yang lebih besar untuk berjaya bersaing untuk potongan masa CPU, tetapi ini tidak mutlak Sesetengah sistem pengendalian tidak sensitif kepada keutamaan benang.

Gangguan benang (gangguan) Mengganggu benang bertujuan untuk memberi isyarat pemberitahuan kepada benang, yang akan menjejaskan bendera gangguan di dalam benang. Urutan ini sendiri tidak akan mengubah keadaan (seperti menyekat, penamatan, dsb.)

Sertai menunggu urutan lain menamatkan kaedah join(), menunggu urutan lain ditamatkan dan memanggil join() kaedah thread dalam thread semasa , kemudian thread semasa bertukar kepada keadaan menyekat dan kembali ke thread lain untuk tamat 🎜>

Thread wake-up (notify) Kaedah notify() dalam kelas Object membangkitkan satu thread yang menunggu pada monitor objek ini Jika semua thread sedang menunggu pada objek ini, salah satu thread akan dipilih untuk bangun. Pilihan adalah sewenang-wenangnya dan berlaku apabila keputusan pelaksanaan dibuat, utas menunggu pada monitor objek dengan memanggil salah satu kaedah tunggu() sehingga utas semasa melepaskan kunci pada objek ini sebelum ia boleh terus melaksanakan utas yang terjaga benang akan bersaing dengan cara biasa dengan semua utas lain secara aktif menyegerakkan pada objek. Kaedah lain yang serupa ialah notifyAll(), yang membangunkan semua utas menunggu pada monitor yang sama.

4. Perbezaan antara tunggu() dan tidur()

① Dari kelas yang berbeza tunggu(): dari kelas Objek; ② Mengenai pelepasan kunci: wait(): kunci akan dilepaskan semasa proses menunggu; sleep(): kunci tidak akan dilepaskan semasa proses menunggu

③ Skop penggunaan: wait(): mesti disegerakkan Digunakan dalam blok kod(): boleh digunakan di mana-mana sahaja;

5 .Prinsip berbilang benang

Prinsip berbilang benang: Berbilang benang dilakukan melalui konkurensi. Untuk CPU, ia hanya boleh melaksanakan satu program pada masa tertentu, iaitu, ia hanya boleh menjalankan satu proses pada masa yang sama CPU akan terus bertukar antara proses ini, dan setiap utas akan dilaksanakan untuk satu masa. Oleh kerana kelajuan pelaksanaan CPU adalah terlalu pantas berbanding persepsi kami, walaupun CPU berputar di antara pelbagai proses, kami merasakan seolah-olah berbilang proses dilaksanakan pada masa yang sama.

CPU akan bertukar antara berbilang proses Jika kita membuka terlalu banyak program, masa yang diambil untuk CPU beralih kepada setiap proses juga akan menjadi lebih lama, dan kita juga akan merasakan bahawa mesin berjalan lebih perlahan. Walaupun penggunaan berbilang benang yang munasabah boleh meningkatkan kecekapan, penggunaan yang berlebihan tidak membawa peningkatan kecekapan.

Teknologi multi-benang terutamanya menyelesaikan masalah pelaksanaan berbilang benang dalam unit pemproses Ia boleh mengurangkan masa melahu unit pemproses dengan ketara dan meningkatkan kapasiti pemprosesan unit pemproses.

Atas ialah kandungan terperinci Apakah cara untuk melaksanakan multithreading di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam