日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

一个请求方法是一个线程吗?不是!

發布時間:2025/7/14 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个请求方法是一个线程吗?不是! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,ThreadLocal 不是用來解決共享對象的多線程訪問問題的,一般情況下,通過ThreadLocal.set() 到線程中的對象是該線程自己使用的對象,其他線程是不需要訪問的,也訪問不到的。各個線程中訪問的是不同的對象。?
另外,說ThreadLocal使得各線程能夠保持各自獨立的一個對象,并不是通過ThreadLocal.set()來實現的,而是通過每個線程中的new 對象 的操作來創建的對象,每個線程創建一個,不是什么對象的拷貝或副本。通過ThreadLocal.set()將這個新創建的對象的引用保存到各線程的自己的一個map中,每個線程都有這樣一個map,執行ThreadLocal.get()時,各線程從自己的map中取出放進去的對象,因此取出來的是各自自己線程中的對象,ThreadLocal實例是作為map的key來使用的。?
如果ThreadLocal.set()進去的東西本來就是多個線程共享的同一個對象,那么多個線程的ThreadLocal.get()取得的還是這個共享對象本身,還是有并發訪問問題。?

之前對于線程和方法的理解有些偏差,竟稀里糊涂的認為一個線程就是一個方法,一個方法就是一個線程。尤其在理解ThreadLocal執行原理的時候,更是暈乎?
(ThreadLocal把當前線程作為key,來維護管理一個可變的對象,在某一個方法里面set值,在后面的某個方法調用里面get值,如果一個方法就是一個線程,那set和get使用的key就不是同一個了,set進去的值get是拿不出來了)?
現在可以肯定,一個線程由一個方法啟動,一個線程里面可以有多個方法,并不是每個方法都是一個線程。?

看下面的實例代碼,主方法里面調用一個方法,并啟動了一個線程,子線程里面調用了一個方法,該方法中又調用了另外一個方法,看看他們的線程名稱都是什么?

public class TestThread extends Thread{public TestThread(String name){super(name);}@Overridepublic void run() {System.out.println("啟動一個子線程,線程名稱為:"+Thread.currentThread().getName());//直接調用方法 runSub();}public void runSub(){System.out.println("在run方法里調用,線程名稱為:"+Thread.currentThread().getName());//直接調用方法 runSubToSub();}public void runSubToSub(){System.out.println("在 runSub里面被調用,線程名稱為:"+Thread.currentThread().getName());}public static void main(String[] args) {System.out.println("當前主線程名稱為:"+Thread.currentThread().getName());//直接調用方法 mainSub();//啟動一個線程new TestThread("我是子線程001").start();}public static void mainSub(){System.out.println("直接在主方法里被調用,線程名稱為:"+Thread.currentThread().getName());} }

看看輸出結果:

當前主線程名稱為:main 直接在主方法里被調用,

線程名稱為:main 啟動一個子線程,

線程名稱為:我是子線程001 在run方法里調用,

線程名稱為:我是子線程001 在 runSub里面被調用,

線程名稱為:我是子線程001

總之,ThreadLocal不是用來解決對象共享訪問問題的,而主要是提供了保持對象的方法和避免參數傳遞的方便的對象訪問方式。歸納了兩點:?
1。每個線程中都有一個自己的ThreadLocalMap類對象,可以將線程自己的對象保持到其中,各管各的,線程可以正確的訪問到自己的對象。?
2。將一個共用的ThreadLocal靜態實例作為key,將不同對象的引用保存到不同線程的ThreadLocalMap中,然后在線程執行的各處通過這個靜態ThreadLocal實例的get()方法取得自己線程保存的那個對象,避免了將這個對象作為參數傳遞的麻煩。?
當然如果要把本來線程共享的對象通過ThreadLocal.set()放到線程中也可以,可以實現避免參數傳遞的訪問方式,但是要注意get()到的是那同一個共享對象,并發訪問問題要靠其他手段來解決。但一般來說線程共享的對象通過設置為某類的靜態變量就可以實現方便的訪問了,似乎沒必要放到線程中。?
ThreadLocal的應用場合,我覺得最適合的是按線程多實例(每個線程對應一個實例)的對象的訪問,并且這個對象很多地方都要用到。?

延伸:

http請求,到業務處理,再到響應的過程,是在一個線程里面的。?
對tomcat來說,每一個進來的請求(request)都需要一個線程,直到該請求結束。tomcat會維護一個線程池,每一個http請求,會從線程池中取出一個空閑線程。默認初始化75個線程,可以進行修改。

Tomcat處理HTTP請求源碼分析(下)、我們發起的HTTP請求如何到達Servlet的、tomcat調優

轉載于:https://www.cnblogs.com/lxl57610/p/8483784.html

總結

以上是生活随笔為你收集整理的一个请求方法是一个线程吗?不是!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。