欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

獲取ApplicationContext的類要實現(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è)務對象,如下:

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

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

圖解如下

多線程知識點

線程啟動的四種方式

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

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

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

4、線程池

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

同一個類中,方法A 引用方法B 方法B加異步@Async注解 不會有效

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

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

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

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

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

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

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

3. Blocked:阻塞,線程進入等待狀態(tài),線程因為某種原因,放棄了CPU的使用權

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

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

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

6. terminated:終止狀態(tài),當前線程執(zhí)行完畢

Java鎖的可重入性

java鎖的可重入性機制可以解決下面這個問題,直接上代碼:

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

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

線程池的四種拒絕策略

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

ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。

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

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

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

sleep和wait的區(qū)別

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

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

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

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

相關文章

  • Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    Mybatis調(diào)用Oracle存儲過程的方法圖文詳解

    這篇文章主要介紹了Mybatis調(diào)用Oracle存儲過程的方法介紹,需要的朋友可以參考下
    2017-09-09
  • 深入理解java中i++和++i的區(qū)別

    深入理解java中i++和++i的區(qū)別

    下面小編就為大家?guī)硪黄钊肜斫鈐ava中i++和++i的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備

    Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備

    這篇文章主要介紹了Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-09-09
  • SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    Zookeeper是一個分布式協(xié)調(diào)服務,它提供了高可用、高性能、可擴展的分布式鎖機制,SpringBoot是一個基于Spring框架的開發(fā)框架,它提供了對Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下
    2023-07-07
  • AJAX中Get請求報錯404的原因以及解決辦法

    AJAX中Get請求報錯404的原因以及解決辦法

    剛學習一門技術時總會踩一些坑,下面這篇文章主要給大家介紹了關于AJAX中Get請求報錯404的原因及解決辦法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • 解決SpringSecurity 一直登錄失敗的問題

    解決SpringSecurity 一直登錄失敗的問題

    這篇文章主要介紹了解決SpringSecurity 一直登錄失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • spring boot攔截器注入不了java bean的原因

    spring boot攔截器注入不了java bean的原因

    這篇文章主要介紹了spring boot攔截器注入不了java bean的原因,幫助大家更好的理解和學習spring boot框架,感興趣的朋友可以了解下
    2020-11-11
  • spring boot自定義log4j2日志文件的實例講解

    spring boot自定義log4j2日志文件的實例講解

    下面小編就為大家分享一篇spring boot自定義log4j2日志文件的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options詳解

    這篇文章主要介紹了Mybatis3中方法返回生成的主鍵:XML,@SelectKey,@Options,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Hadoop上Data Locality的詳解

    Hadoop上Data Locality的詳解

    這篇文章主要介紹了 Hadoop上Data Locality的詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10

最新評論