Java多線程run方法中怎麼直接呼叫service業務類
多執行緒run方法中直接呼叫service業務類別應注意
Java多執行緒run方法裡邊使用service業務類別會產生java.lang.NullPointerException異常的問題,這是由於spring注入的業務類為null,或直接new的業務物件也為null。
多執行緒為了執行緒安全性會防止注入,因此在想使用service業務類別時,需要使用ApplicationContext的方式來取得bean的方法來取得service類別。
取得ApplicationContext的類別要實作ApplicationContextAware接口,如下:
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; } }
然後在run方法使用上述方法建立業務對象,如下:
XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);
這樣就能正常使用該業務類了。
圖解如下
#多執行緒知識點
執行緒啟動的四種方式
1.、繼承Thread類別重寫Thread的run方法,在run方法中進行操作,用start方法啟動執行緒
2、繼承Runnable接口,實作run方法,在run方法中進行操作,需要傳入目前類別的實例物件建立一個Thread實例,然後呼叫start方法啟動執行緒
3、實作Callable接口,重寫call()方法,需要注意的是,前兩種方法都是不需要回應的,直接就執行了,但是實現Callable接口,重寫call()方法則是需要等待線程回應的,所以雖然啟動了其他線程,但是卻是一個線程在執行,並不能算是標準的多線程。
4、執行緒池
#使用@Aysnc註解實作多執行緒
#同一個類中,方法A 引用方法B 方法B加異步@Async註解不會有效
被加@Async方法和呼叫方不能再同一個類別中
用戶執行緒與守護執行緒的區別
Java內創建的線程預設是創建用戶線程,例如new Thread(線程物件).start
Thread thread = new Thread(); // 默认为false,都是用户线程 thread.setDaemon(true); // 表示设置为守护线程 thread.setDaemon(false); // 表示设置为用户线程
用戶線程:不zhi隨著其他執行緒的死亡而死亡,只有兩種情況dao死掉,一是在運行中出現異常而終止,二是正常把程式執行完畢,執行緒死亡
守護線程:隨著用戶線程的死亡而死亡,當用戶線程死完了守護線程也死了,例如gc垃圾回收線程。用戶線程存在,那gc就有活著的必要,反之就沒用了。
線程的六種狀態
1. New:初始狀態,執行緒被創建,沒有呼叫start()
2. Runnable:運行狀態,Java執行緒把作業系統中的就緒和運行兩種狀態統一稱為「運行中」
3. Blocked:阻塞,執行緒進入等待狀態,執行緒因為某種原因,放棄了CPU的使用權
阻塞的幾個情況:
#A. 等待阻塞:運行的執行緒執行了wait(),JVM會把目前執行緒放入等待佇列
B. 同步阻塞:執行的執行緒在取得物件的同步鎖定時,如果該同步鎖定被其他執行緒佔用了,JVM會把目前執行緒放入鎖池中
C. 其他阻塞:運行的執行緒執行sleep(),join()或發出IO請求時,JVM會把目前執行緒設定為阻塞狀態,當sleep()執行完,join()執行緒終止,IO處理完畢執行緒再次恢復
4. Waiting:等待狀態
5. timed_waiting:逾時等待狀態,逾時日後自動回傳
6. terminated:終止狀態,目前執行緒執行完畢
Java鎖定的可重入性
java鎖定的可重入性機制可以解決下面這個問題,直接上程式碼:
public class Demo1 { public synchronized void functionA(){ System.out.println("iAmFunctionA"); functionB(); } public synchronized void functionB(){ System.out.println("iAmFunctionB"); }
假設Java沒有提供synchronized 強制原子性的內部鎖定機制:functionA()和functionB()都是同步方法,當執行緒進入funcitonA()會取得該類別的物件鎖,這個鎖"new Demo1()",在functionA()對方法functionB()做了調用,但是functionB()也是同步的,因此該線程需要再次獲得該物件鎖(new Demo1()),但是JVM會認為這個執行緒已經取得了此物件的鎖,而不能再取得,從而無法呼叫functionB()方法,從而造成死鎖。
執行緒池的四個拒絕策略
當執行緒池的任務快取佇列已滿並且執行緒池中的執行緒數目達到maximumPoolSize時,如果還有任務到來就會採取任務拒絕策略,通常有以下四種策略:
ThreadPoolExecutor.AbortPolicy
:丟棄任務並拋出RejectedExecutionException例外。
ThreadPoolExecutor.DiscardPolicy
:丟棄任務,但是不拋出例外。
ThreadPoolExecutor.DiscardOldestPolicy
:丟棄佇列最前面的任務,然後重新提交被拒絕的任務
ThreadPoolExecutor.CallerRunsPolicy
:由呼叫執行緒(提交任務的執行緒)處理該任務
sleep和wait的差異
#sleep是執行緒中的方法,但是wait是Object中的方法
sleep方法不會釋放lock,但是wait會釋放,而且會加入到等待佇列中
-
sleep不需要被喚醒,但wait需要
為什麼wait(),notify(),notifyAll()在物件中,而不在Thread類別中
java中鎖的層級是物件級而不是執行緒級,每個物件都有鎖,透過執行緒取得。如果wait()方法在執行緒中,則執行緒正在等待的是哪個鎖就不明顯了。
以上是Java多線程run方法中怎麼直接呼叫service業務類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
