多線程有什麼用?

General 更新 2024-11-24

什麼是線程?有什麼用 講得通俗點

說到線程 就要說到進程

你可以這樣理解

進程是指在系統中正在運行的一個應用程序;線程是系統分配處理器時間資源的基本單元,或者說進程之內獨立執行的一個單元。對於操作系統而言,其調度單元是線程。

可以理解成一個或多個線程組成了一個進程

給你舉個例子

在線看視頻 其實是 一邊從網上下載 一邊用播放器播放,從進程來講就一個(咱們打開的網頁) , 其中下載由一個線程管理,播放由一個線程管理.

多線程的程序有什麼好處

資源利用率更好

想象一下,一個應用程序需要從本地文件系統中讀取和處理文件的情景。比方說,從磁盤讀取一個文件需要5秒,處理一個文件需要2秒。處理兩個文件則需要:

5秒讀取文件A

2秒處理文件A

5秒讀取文件B

2秒處理文件B

---------------------

總共需要14秒

從磁盤中讀取文件的時候,大部分的CPU時間用於等待磁盤去讀取數據。在這段時間裡,CPU非常的空閒。它可以做一些別的事情。通過改變操作的順序,就能夠更好的使用CPU資源。看下面的順序:

5秒讀取文件A

5秒讀取文件B + 2秒處理文件A

2秒處理文件B

---------------------

總共需要12秒

CPU等待第一個文件被讀取完。然後開始讀取第二個文件。當第二文件在被讀取的時候,CPU會去處理第一個文件。記住,在等待磁盤讀取文件的時候,CPU大部分時間是空閒的。

總的說來,CPU能夠在等待IO的時候做一些其他的事情。這個不一定就是磁盤IO。它也可以是網絡的IO,或者用戶輸入。通常情況下,網絡和磁盤的IO比CPU和內存的IO慢的多。

程序設計更簡單

在單線程應用程序中,如果你想編寫程序手動處理上面所提到的讀取和處理的順序,你必須記錄每個文件讀取和處理的狀態。相反,你可以啟動兩個線程,每

個線程處理一個文件的讀取和操作。線程會在等待磁盤讀取文件的過程中被阻塞。在等待的時候,其他的線程能夠使用CPU去處理已經讀取完的文件。其結果就

是,磁盤總是在繁忙地讀取不同的文件到內存中。這會帶來磁盤和CPU利用率的提升。而且每個線程只需要記錄一個文件,因此這種方式也很容易編程實現。

程序響應更快

將一個單線程應用程序變成多線程應用程序的另一個常見的目的是實現一個響應更快的應用程序。設想一個服務器應用,它在某一個端口監聽進來的請求。當一個請求到來時,它去處理這個請求,然後再返回去監聽。

服務器的流程如下所述:

while(server is active){

listen for request

process request

}

如果一個請求需要佔用大量的時間來處理,在這段時間內新的客戶端就無法發送請求給服務端。只有服務器在監聽的時候,請求才能被接收。另一種設計是,

監聽線程把請求傳遞給工作者線程(worker

thread),然後立刻返回去監聽。而工作者線程則能夠處理這個請求併發送一個回覆給客戶端。這種設計如下所述:

while(server is active){

listen for request

hand request to worker thread

}

這種方式,服務端線程迅速地返回去監聽。因此,更多的客戶端能夠發送請求給服務端。這個服務也變得響應更快。

桌面應用也是同樣如此。如果你點擊一個按鈕開始運行一個耗時的任務,這個線程既要執行任務又要更新窗口和按鈕,那麼在任務執行的過程中,這個應用程

序看起來好像沒有反應一樣。相反,任務可以傳遞給工作者線程(word

thread)。當工作者線程在繁忙地處理任務的時候,窗口線程可以自由地響應其他用戶的請求。當工作者線程完成任務的時候,它發送信號給窗口線程。窗口

線程便可以更新應用程序窗口,並顯示任務的結果。對用戶而言,這種具有工作者線程設計的程序顯得響應速度更快。

一個主頁 裡面有30個模塊 30個模塊分別讀取數據庫的數據

這個頁面 如果不用多線程,你開打以後,會看到白頁,10秒以後 所有模塊一瞬間看到

而多線程,打開頁面的第一......

多線程編程的好處及在什麼情況下用多線程

CPU是以時間片的方式為進程分配CUP處理時間的,當一個進程以同步的方式去完成幾件事情時,此進程必須完成了第一件事情以後再做第二件事,如此按順序地向CPU請求完成要做的事情。在此單線程的工作模式下,如果把CUP看作是一共有100個時間片的話,CPU可能一直都只是花了其中的10個時間片來處理當前進程所要做的事情,只是用到了CPU的10%的時間片,而其他時間都白白浪費了,當然,實際上CPU的工作模式還是做完一件事以後再去做另一件事,只是CUP的處理速度非常快,很快就處理完成所請求的情事。

為了提高CPU的使用率,採用多線程的方式去同時完成幾件事情而互不干擾,如當前進程要完成三件事情1、2、3,那麼CPU會分別用10%的時間來同時處理這3件事情,從而讓CPU的使用率達到了30%,大大地提高了CPU的利用率。多線程的好處在處理一些特殊的場合其優勢尤其明顯。比如下載文件,你要一邊下載一邊顯示進度一邊保存,在這種情況下,如果沒有用多線程的話,沒有意外的話一般都會把主線程阻塞,比如進度條的進度根本沒有隨著已下載的量而變化,堪至是整個窗體都動不了,用多線程就可以很好地解決這個問題。

這裡有一個生活實例可能更好地去理解多線程:回去看你女朋友做飯,正常的話她都會把洗好的菜(肉)先放到鍋裡煮,然後一邊洗別的菜或處理別的事情,如:洗碗、收拾桌臺準備開飯,人還是一個人,但她同時做幾件事情,這樣就可以大大地提高效率。總的一句話就是:CPU還是要花同樣多的時間去完成所有的事情,但多線程可以讓CPU摻插地同時做多件事情,在視覺上讓用戶覺得計算機在同時幫他處理多件事情,更好地改善用戶體驗。

瞭解了多線程的好處以後,就要了解應該在什麼樣的情況下使用多線程技術。因為並不是說所有情況下用多線程都是好事,因為多線程的情況下,CPU還要花時間去維護,CPU處理各線程的請求時在線程間的切換也要花時間,所以一般情況下是可以不用多線程的,用了有時反而會得不償失。大多情況下,要用到多線程的主要是需要處理大量的IO操作時或處理的情況需要花大量的時間等等,比如:讀寫文件、視頻圖像的採集、處理、顯示、保存等。

Java的多線程有什麼用處

多線程可以把任務分塊執行,分塊後可以同時進行而不用等待。 這樣效率更高

如下載文件,通過多線程就可以實現多文件下載

什麼是多線程?有什麼作用?

進程中的所有線程共享進程的虛擬地址空間,進程中的線程是並行執行的,系統為每個線程劃分執行時間,

多線程是什麼,有什麼好處呢

舉個例子,你要做飯,你要做的飯是米飯和一個炒菜。

如果是單線程,那麼你可以如下做:

第一種方法:先炒菜,然後開始蒸米飯;

第二種方法:先蒸米飯,等米飯熟了再炒菜;

如果是多線程,那麼你就可以如下做:

先蒸米飯,在蒸米飯的過程中去炒菜。

有些問題的解決用多線程會提高效率,比如上邊的例子。但是有時不會提高效率,反而會影響效率:

比如,你要洗衣服,還打算做家庭作業(假設你是小學生,老師給你佈置的家庭作業)。

如果是單線程:你要麼洗完衣服做作業,要麼做完作業洗衣服。

如果是多線程:你洗一分鐘衣服做一分鐘作業,交叉進行,顯然有些時間都耗在了任務的切換上了。

所以,多線程主要用於,當一個任務需要不佔用資源的等待的時候,可以使用空閒的資源做其他的事情。比如類似於QQ聊天的程序,程序的一個線程一直在等待著看是否有好友發消息過來,而與此同時另一個線程允許你打字並且將自己的消息發送給對方。

以上例子並不是很完美,只是希望能借這些例子對多線程有所理解。

在什麼情況下要用到多線程

在單CPU系統中,系統調度在某一時刻只能讓一個線程運行,雖然這種調試機制有多種形式(大多數是時間片輪巡為主),但無論如何,要通過不斷切換需要運行的線程讓其運行的方式就叫併發(concurrent)。而在多CPU系統中,可以讓兩個以上的線程同時運行,這種可以同時讓兩個以上線程同時運行的方式叫做並行(parallel)。我也有段時間糾結於這裡,無論如何我必須得給你明確一點:在某一個時間點,一個CPU(單)只會運行某一個進程裡的單個線程,所以我們經常稱之為併發,說道同步機制,其實多線程並未真正實現微觀意義上的同步,進程是一個運行單元,線程則是更小的運行單元,簡而言之,就是進程細分成多個線程,譬如:一個進程A運行需要1s,它就會切換到進程B,但是實現多線程機制後,進程A細化成10個線程,每個線程只需運行0.1s,當然B線程也一樣,這就出現,線程之間的切換時間更短,從宏觀上看就出現同步幻象了。所以學習多線程你得真正理解所謂的同步併發,並不是真正的“同步”。當你理解這些的時候,你就初略的感覺什麼時候該使用多線程機制,其實你的電腦每個程序都至少有一個主線程,那個管理器中的每一個進程,其實內部包含若干線程,每個時間點都是某個程序進程中的某個線程在運行。

多線程的程序有什麼好處?

1個主頁 裡面有30個模塊 30個模塊分別讀取數據庫的數據

這個頁面 如果不用多線程,你開打以後,會看到白頁,10秒以後 所有模塊一瞬間看到

而多線程,打開頁面的第一秒 頁面就打開了 這時候 頁面上只有3個模塊 然後 每過1秒 漫漫的 都顯示出來

用戶體驗好

java中多線程地併發運行是什麼意思?有什麼作用.好處?

多線程的併發運行就相當一邊幹這一邊幹那,可以同時處理2個行為邏輯。

啟動線程有什麼用

當用start()開始一個線程後,線程就進入就緒狀態,使線程所代表的虛擬處理機處於可運行狀態,這意味著它可以由JVM調度並執行。這並不意味著線程就會立即運行。當cpu分配給它時間時,才開始執行run()方法(如果有的話)。START()是方法,它調用RUN()方法.而RUN()方法是你必須重寫的. run()方法中包含的是線程的主體。繼承Thread類的啟動方式: public class ThreadStartTest { public static void main(String[] args) { ThreadTest tt = new ThreadTest();// 創建一個線程實例 tt.start(); // 啟動線程 } } 實現Runnable接口的啟動方式:public class RunnableStartTest { public static void main(String[] args) { Thread t = new Thread(new RunnableTest()); // 創建一個線程實例 t.start(); // 啟動線程 } } 實際上這兩種啟動線程的方式原理是一樣的。首先都是調用本地方法啟動一個線程,其次是在這個線程裡執行目標對象的run()方法。那麼這個目標對象是什麼呢?為了弄明白這個問題,我們來看看Thread類的run()方法的實現:public void run() { if (target != null) { target.run(); } } 當我們採用實現Runnable接口的方式來實現線程的情況下,在調用new Thread(Runnable target)構造器時,將實現Runnable接口的類的實例設置成了線程要執行的主體所屬的目標對象target,當線程啟動時,這個實例的 run()方法就被執行了。當我們採用繼承Thread的方式實現線程時,線程的這個run()方法被重寫了,所以當線程啟動時,執行的是這個對象自身的 run()方法。

相關問題答案
多線程有什麼用?
多線程是什麼?
鼠標線夾有什麼用?
紅線蟲有什麼用處?
關閉超線程有什麼壞處?
魚骨繞線器有什麼用?
集線器有什麼用?
攜程貴賓卡有什麼用?
畫眼線有什麼用?
評助理工程師有什麼用?