中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程run方法中怎么直接調用service業務類

發布時間:2022-06-21 13:42:06 來源:億速云 閱讀:1204 作者:iii 欄目:開發技術

這篇文章主要介紹“Java多線程run方法中怎么直接調用service業務類”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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);

這樣就能正常使用該業務類了。

圖解如下

Java多線程run方法中怎么直接調用service業務類

Java多線程run方法中怎么直接調用service業務類

Java多線程run方法中怎么直接調用service業務類

多線程知識點

線程啟動的四種方式

1.、繼承Thread類重寫Thread的run方法,在run方法中進行操作,用start方法啟動線程

Java多線程run方法中怎么直接調用service業務類

2、繼承Runnable接口,實現run方法,在run方法中進行操作,需要傳入當前類的實例對象創建一個Thread實例,然后調用start方法啟動線程

Java多線程run方法中怎么直接調用service業務類

3、實現Callable接口,重寫call()方法,需要注意的是,前兩種方法都是不需要響應的,直接就執行了,但是實現Callable接口,重寫call()方法則是需要等待線程響應的,所以雖然啟動了其他線程,但是卻是一個線程在執行,并不能算標準的多線程。

Java多線程run方法中怎么直接調用service業務類

4、線程池

Java多線程run方法中怎么直接調用service業務類

使用@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業務類”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁国市| 封开县| 荆门市| 平乡县| 湘乡市| 江油市| 普格县| 曲水县| 衡东县| 武城县| 温州市| 长岭县| 鄂伦春自治旗| 衢州市| 肃宁县| 镶黄旗| 杂多县| 长泰县| 廉江市| 翁牛特旗| 琼结县| 龙泉市| 宣汉县| 轮台县| 定襄县| 安阳县| 鲁山县| 龙川县| 陆河县| 汕尾市| 新乡县| 镇康县| 织金县| 贵阳市| 壤塘县| 揭阳市| 新昌县| 卓资县| 思茅市| 武宣县| 浦江县|