最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程run方法中直接調(diào)用service業(yè)務(wù)類應(yīng)注意的問(wèn)題及解決

 更新時(shí)間:2022年06月21日 11:45:05   作者:ddm01  
這篇文章主要介紹了Java多線程run方法中直接調(diào)用service業(yè)務(wù)類應(yīng)注意的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

多線程run方法中直接調(diào)用service業(yè)務(wù)類應(yīng)注意

Java多線程run方法里邊使用service業(yè)務(wù)類會(huì)產(chǎn)生java.lang.NullPointerException異常的問(wèn)題,這是由于spring注入的業(yè)務(wù)類為null,或者直接new的業(yè)務(wù)對(duì)象也為null。

多線程為了線程安全會(huì)防止注入,因此在想使用service業(yè)務(wù)類時(shí),需要使用ApplicationContext的方式獲取bean的方法獲取service類。

獲取ApplicationContext的類要實(shí)現(xiàn)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方法里使用以上方法創(chuàng)建業(yè)務(wù)對(duì)象,如下:

XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);

這樣就能正常使用該業(yè)務(wù)類了。

圖解如下

多線程知識(shí)點(diǎn)

線程啟動(dòng)的四種方式

1.、繼承Thread類重寫Thread的run方法,在run方法中進(jìn)行操作,用start方法啟動(dòng)線程

2、繼承Runnable接口,實(shí)現(xiàn)run方法,在run方法中進(jìn)行操作,需要傳入當(dāng)前類的實(shí)例對(duì)象創(chuàng)建一個(gè)Thread實(shí)例,然后調(diào)用start方法啟動(dòng)線程

3、實(shí)現(xiàn)Callable接口,重寫call()方法,需要注意的是,前兩種方法都是不需要響應(yīng)的,直接就執(zhí)行了,但是實(shí)現(xiàn)Callable接口,重寫call()方法則是需要等待線程響應(yīng)的,所以雖然啟動(dòng)了其他線程,但是卻是一個(gè)線程在執(zhí)行,并不能算標(biāo)準(zhǔn)的多線程。

4、線程池

使用@Aysnc注解實(shí)現(xiàn)多線程

同一個(gè)類中,方法A 引用方法B 方法B加異步@Async注解 不會(huì)有效

被加@Async方法和調(diào)用方 不能再同一個(gè)類中

用戶線程與守護(hù)線程的區(qū)別

Java內(nèi)創(chuàng)建的線程默認(rèn)是創(chuàng)建用戶線程,比如new Thread(線程對(duì)象).start

    Thread thread = new Thread();
    // 默認(rèn)為false,都是用戶線程
    thread.setDaemon(true); // 表示設(shè)置為守護(hù)線程
    thread.setDaemon(false); // 表示設(shè)置為用戶線程
  • 用戶線程:不zhi隨著其他線程的死亡而死亡,只有兩種情況dao死掉,一是在運(yùn)行中出現(xiàn)異常而終止,二是正常把程序執(zhí)行完畢,線程死亡
  • 守護(hù)線程:隨著用戶線程的死亡而死亡,當(dāng)用戶線程死完了守護(hù)線程也死了,比如gc垃圾回收線程。用戶線程存在,那gc就有活著的必要,反之就沒(méi)用了。

線程的六種狀態(tài)

1. New:初始狀態(tài),線程被創(chuàng)建,沒(méi)有調(diào)用start()

2. Runnable:運(yùn)行狀態(tài),Java線程把操作系統(tǒng)中的就緒和運(yùn)行兩種狀態(tài)統(tǒng)一稱為“運(yùn)行中”

3. Blocked:阻塞,線程進(jìn)入等待狀態(tài),線程因?yàn)槟撤N原因,放棄了CPU的使用權(quán)

  • 阻塞的幾種情況:
  • A. 等待阻塞:運(yùn)行的線程執(zhí)行了wait(),JVM會(huì)把當(dāng)前線程放入等待隊(duì)列
  • B. 同步阻塞:運(yùn)行的線程在獲取對(duì)象的同步鎖時(shí),如果該同步鎖被其他線程占用了,JVM會(huì)把當(dāng)前線程放入鎖池中
  • C. 其他阻塞:運(yùn)行的線程執(zhí)行sleep(),join()或者發(fā)出IO請(qǐng)求時(shí),JVM會(huì)把當(dāng)前線程設(shè)置為阻塞狀態(tài),當(dāng)sleep()執(zhí)行完,join()線程終止,IO處理完畢線程再次恢復(fù)

4. Waiting:等待狀態(tài)

5. timed_waiting:超時(shí)等待狀態(tài),超時(shí)以后自動(dòng)返回

6. terminated:終止?fàn)顟B(tài),當(dāng)前線程執(zhí)行完畢

Java鎖的可重入性

java鎖的可重入性機(jī)制可以解決下面這個(gè)問(wèn)題,直接上代碼:

 public class Demo1 {
    public synchronized void functionA(){
        System.out.println("iAmFunctionA");
        functionB();
    }
    public synchronized void functionB(){
        System.out.println("iAmFunctionB");
    }

假設(shè)Java沒(méi)有提供synchronized 強(qiáng)制原子性的內(nèi)部鎖機(jī)制:functionA()和functionB()都是同步方法,當(dāng)線程進(jìn)入funcitonA()會(huì)獲得該類的對(duì)象鎖,這個(gè)鎖"new Demo1()",在functionA()對(duì)方法functionB()做了調(diào)用,但是functionB()也是同步的,因此該線程需要再次獲得該對(duì)象鎖(new Demo1()),但是JVM會(huì)認(rèn)為這個(gè)線程已經(jīng)獲取了此對(duì)象的鎖,而不能再次獲取,從而無(wú)法調(diào)用functionB()方法,從而造成死鎖。

線程池的四種拒絕策略

當(dāng)線程池的任務(wù)緩存隊(duì)列已滿并且線程池中的線程數(shù)目達(dá)到maximumPoolSize時(shí),如果還有任務(wù)到來(lái)就會(huì)采取任務(wù)拒絕策略,通常有以下四種策略:

ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。

ThreadPoolExecutor.DiscardPolicy:丟棄任務(wù),但是不拋出異常。

ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊(duì)列最前面的任務(wù),然后重新提交被拒絕的任務(wù)

ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程(提交任務(wù)的線程)處理該任務(wù)

sleep和wait的區(qū)別

  • sleep是線程中的方法,但是wait是Object中的方法
  • sleep方法不會(huì)釋放lock,但是wait會(huì)釋放,而且會(huì)加入到等待隊(duì)列中
  • sleep不需要被喚醒,但是wait需要

為什么wait(),notify(),notifyAll()在對(duì)象中,而不在Thread類中

java中鎖的級(jí)別是對(duì)象級(jí)而不是線程級(jí),每個(gè)對(duì)象都有鎖,通過(guò)線程獲得。如果wait()方法在線程中,線程正在等待的是哪個(gè)鎖就不明顯了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out)

    IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?o

    本文主要介紹了IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題

    如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題

    這篇文章主要介紹了如何將char類型的數(shù)字字符轉(zhuǎn)換成int類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 對(duì)ArrayList和LinkedList底層實(shí)現(xiàn)原理詳解

    對(duì)ArrayList和LinkedList底層實(shí)現(xiàn)原理詳解

    今天小編就為大家分享一篇對(duì)ArrayList和LinkedList底層實(shí)現(xiàn)原理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說(shuō)明

    Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說(shuō)明

    這篇文章主要介紹了Java中l(wèi)ist集合為空或?yàn)閚ull的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java Objects工具類原理及用法詳解

    Java Objects工具類原理及用法詳解

    這篇文章主要介紹了Java Objects工具類原理及用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringSecurity配置HTTPS的實(shí)現(xiàn)

    SpringSecurity配置HTTPS的實(shí)現(xiàn)

    本文介紹了SpringBoot項(xiàng)目中配置HTTPS并集成SpringSecurity,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • SpringBoot自動(dòng)裝配之@Enable深入講解

    SpringBoot自動(dòng)裝配之@Enable深入講解

    這篇文章主要介紹了SpringBoot自動(dòng)裝配之@Enable,SpringBoot中提供了很多Enable開頭的注解,這些注解都是用于動(dòng)態(tài)啟用某些功能的。而其底層原理是使用@Import注?解導(dǎo)入一些配置類,實(shí)現(xiàn)Bean的動(dòng)態(tài)加載
    2023-01-01
  • SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼

    SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類型圖片的實(shí)現(xiàn),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • 使用springboot logback動(dòng)態(tài)獲取application的配置項(xiàng)

    使用springboot logback動(dòng)態(tài)獲取application的配置項(xiàng)

    這篇文章主要介紹了使用springboot logback動(dòng)態(tài)獲取application的配置項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java map遍歷的四種方法總結(jié)

    java map遍歷的四種方法總結(jié)

    以下是我整理的關(guān)于java中map的遍歷的四種方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10

最新評(píng)論

永宁县| 嵊泗县| 茌平县| 宁明县| 库伦旗| 乐东| 武鸣县| 逊克县| 建水县| 曲沃县| 屯留县| 武平县| 北海市| 中西区| 阿鲁科尔沁旗| 福建省| 保德县| 苏州市| 法库县| 安康市| 皋兰县| 江陵县| 仙桃市| 营山县| 盐城市| 富顺县| 大悟县| 湟中县| 宜兰市| 读书| 岑巩县| 南京市| 高要市| 广元市| 抚州市| 阆中市| 安图县| 桂平市| 呼和浩特市| 左贡县| 郎溪县|