Rumah > Java > javaTutorial > teks badan

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

王林
Lepaskan: 2023-05-12 14:22:06
ke hadapan
2417 orang telah melayarinya

Anda harus memberi perhatian untuk memanggil terus kelas perniagaan perkhidmatan dalam kaedah larian berbilang benang

Menggunakan kelas perniagaan perkhidmatan dalam kaedah larian berbilang benang Java akan menyebabkan pengecualian java.lang.NullPointerException. Ini disebabkan oleh kelas perniagaan yang disuntik oleh musim bunga adalah batal, atau objek perniagaan baharu langsung juga adalah batal.

Multi-threading akan menghalang suntikan untuk keselamatan benang Oleh itu, apabila anda ingin menggunakan kelas perniagaan perkhidmatan, anda perlu menggunakan kaedah ApplicationContext untuk mendapatkan kaedah kacang untuk mendapatkan kelas perkhidmatan.

Kelas untuk mendapatkan ApplicationContext mesti melaksanakan antara muka ApplicationContextAware, seperti berikut:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
public class ApplicationContextUtil implements ApplicationContextAware {
 
	private static ApplicationContext context;
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		this.context = context;
	}
	public static ApplicationContext getContext() {
		return context;
	}
}
Salin selepas log masuk

Kemudian gunakan kaedah di atas dalam kaedah run untuk mencipta objek perniagaan, seperti berikut:

XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);
Salin selepas log masuk

Cara ini boleh digunakan seperti biasa Kelas perniagaan sudah tamat.

Rajah adalah seperti berikut

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

Mata pengetahuan pelbagai benang

Empat cara untuk memulakan utas

1 Warisi kelas Thread dan tulis semula kaedah run Thread, lakukan operasi dalam kaedah run dan gunakan kaedah mula untuk memulakan thread

<. 🎜>

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

2. kemudian panggil kaedah mula untuk memulakan urutan

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

3 Laksanakan antara muka Boleh Panggil dan tulis semula kaedah panggilan() Perlu diingatkan bahawa dua kaedah pertama tidak memerlukan jawapan dan dilaksanakan secara langsung Walau bagaimanapun, jika anda melaksanakan antara muka Boleh Dipanggil dan menulis semula kaedah panggilan(), Anda perlu menunggu benang untuk bertindak balas, jadi walaupun utas lain dimulakan, satu utas sedang dilaksanakan dan ia tidak boleh dipertimbangkan. berbilang benang standard.

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

4 Kumpulan benang

Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java

Gunakan anotasi @Aysnc untuk melaksanakan berbilang benang

kelas yang sama , kaedah A merujuk kepada kaedah B. Menambah anotasi @Async tak segerak pada kaedah B tidak akan berkesan

Kaedah @Async yang ditambah dan pemanggil tidak boleh berada dalam kelas yang sama

Perbezaan antara benang pengguna dan benang daemon

Benang yang dibuat dalam Java lalai untuk mencipta benang pengguna, seperti Benang baharu (objek benang).mulakan

    Thread thread = new Thread();
    // 默认为false,都是用户线程
    thread.setDaemon(true); // 表示设置为守护线程
    thread.setDaemon(false); // 表示设置为用户线程
Salin selepas log masuk

  • Urutan pengguna : Tidak Ia mati apabila utas lain mati Terdapat hanya dua situasi apabila ia mati, satu ialah ia ditamatkan kerana pengecualian semasa operasi, dan satu lagi ialah program dijalankan secara normal dan utas mati .

  • Benang Daemon: Mati apabila benang pengguna mati Apabila benang pengguna mati, benang daemon juga mati, seperti benang kutipan sampah gc. Jika benang pengguna wujud, maka gc perlu hidup, jika tidak, ia akan menjadi sia-sia.

Enam keadaan urutan

1 Baharu: Keadaan awal, urutan dibuat, tiada permulaan() dipanggil

2. Run Status, benang Java memanggil dua keadaan sedia dan berjalan dalam sistem pengendalian "berjalan"

3. Disekat: disekat, benang memasuki keadaan menunggu, dan benang melepaskan penggunaan CPU untuk beberapa sebab

  • Beberapa situasi penyekatan:

  • A Menunggu untuk menyekat: Benang yang sedang berjalan melaksanakan wait(), dan JVM akan Put dalam baris gilir menunggu

  • B. Penyekatan segerak: Apabila benang berjalan memperoleh kunci penyegerakan objek, jika kunci penyegerakan diduduki oleh utas lain, JVM akan meletakkan utas semasa ke dalam Pool kunci

  • C Penyekatan lain: Apabila utas yang sedang berjalan melaksanakan sleep(), join() atau mengeluarkan permintaan IO, JVM akan menetapkan urutan semasa kepada keadaan menyekat. . Apabila sleep() Selepas pelaksanaan, thread join() ditamatkan, dan pemprosesan IO selesai dan thread disambung semula

4 5. timed_waiting: keadaan menunggu tamat masa, secara automatik selepas tamat masa Pulangan

6 ditamatkan: Status penamatan, urutan semasa telah menyelesaikan pelaksanaan

Reentrancy of Java lock

Mekanisme kemasukan semula. kunci Java boleh menyelesaikan masalah berikut , pergi terus ke kod:

 public class Demo1 {
    public synchronized void functionA(){
        System.out.println("iAmFunctionA");
        functionB();
    }
    public synchronized void functionB(){
        System.out.println("iAmFunctionB");
    }
Salin selepas log masuk
Andaikan Java tidak menyediakan mekanisme kunci dalaman yang disegerakkan yang memaksa atomicity: functionA() dan functionB() kedua-duanya adalah kaedah disegerakkan benang memasuki funcitonA(), ia akan memperoleh kunci objek kelas ini, kunci ini "Demo1()" memanggil kaedah functionB() dalam functionA(), tetapi functionB() juga disegerakkan, jadi benang perlu. dapatkan kunci objek (Demo1() baharu) sekali lagi, tetapi JVM akan Ia dianggap bahawa utas ini telah memperoleh kunci objek ini dan tidak boleh memperolehnya semula, jadi ia tidak boleh memanggil kaedah functionB(), menyebabkan kebuntuan.

Empat strategi penolakan kumpulan benang

Apabila baris gilir cache tugasan kumpulan benang penuh dan bilangan utas dalam kumpulan benang mencapai maksimumPoolSize, jika masih terdapat tugasan yang tiba, strategi penolakan tugas akan diterima pakai, biasanya Empat strategi berikut:

ThreadPoolExecutor.AbortPolicy: buang tugas dan buang RejectedExecutionException.

ThreadPoolExecutor.DiscardPolicy: Buang tugas, tetapi jangan buang pengecualian.

ThreadPoolExecutor.DiscardOldestPolicy: Buang tugas paling hadapan baris gilir, dan kemudian serahkan semula tugasan yang ditolak

ThreadPoolExecutor.CallerRunsPolicy: Tugasan diproses oleh urutan panggilan (urutan yang menyerahkan tugasan)

Perbezaan antara tidur dan tunggu

  • tidur ialah kaedah dalam benang, tetapi tunggu ialah kaedah dalam Objek

  • Kaedah tidur tidak akan melepaskan kunci, tetapi tunggu akan dilepaskan dan ditambah pada baris gilir menunggu

  • tidur tidak perlu dikejutkan, tetapi menunggu perlu

Mengapa tunggu( ), notify(), notifyAll() berada dalam objek, bukan dalam kelas Thread

Tahap kunci dalam Java ialah tahap objek dan bukannya tahap benang. Setiap objek mempunyai kunci, yang diperoleh melalui benang. Jika kaedah wait() berada dalam benang, tidak jelas kunci mana yang ditunggu oleh benang itu.

Atas ialah kandungan terperinci Bagaimana untuk memanggil kelas perniagaan perkhidmatan secara langsung dalam kaedah larian berbilang benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!