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; } }
Kemudian gunakan kaedah di atas dalam kaedah run untuk mencipta objek perniagaan, seperti berikut:
XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);
Cara ini boleh digunakan seperti biasa Kelas perniagaan sudah tamat.
1 Warisi kelas Thread dan tulis semula kaedah run Thread, lakukan operasi dalam kaedah run dan gunakan kaedah mula untuk memulakan thread
<. 🎜>2. kemudian panggil kaedah mula untuk memulakan urutan 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. 4 Kumpulan benangGunakan 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); // 表示设置为用户线程
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.
public class Demo1 { public synchronized void functionA(){ System.out.println("iAmFunctionA"); functionB(); } public synchronized void functionB(){ System.out.println("iAmFunctionB"); }
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)
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
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!