成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

多線程的優點和代價

開發 后端
盡管面臨很多挑戰,多線程有一些優點使得它一直被使用。

盡管面臨很多挑戰,多線程有一些優點使得它一直被使用。這些優點是:

  • 資源利用率更好

  • 程序設計在某些情況下更簡單

  • 程序響應更快

資源利用率更好

想象一下,一個應用程序需要從本地文件系統中讀取和處理文件的情景。比方說,從磁盤讀取一個文件需要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利用率的提升。而且每個線程只需要記錄一個文件,因此這種方式也很容易編程實現。

程序響應更快

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

服務器的流程如下所述:

  1. while(server is active){ 
  2.     listen for request 
  3.     process request 

如果一個請求需要占用大量的時間來處理,在這段時間內新的客戶端就無法發送請求給服務端。只有服務器在監聽的時候,請求才能被接收。另一種設計是,監聽線 程把請求傳遞給工作者線程(worker thread),然后立刻返回去監聽。而工作者線程則能夠處理這個請求并發送一個回復給客戶端。這種設計如下所述:

  1. while(server is active){ 
  2.     listen for request 
  3.     hand request to worker thread 

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

桌面應用也是同樣如此。如果你點擊一個按鈕開始運行一個耗時的任務,這個線程既要執行任務又要更新窗口和按鈕,那么在任務執行的過程中,這個應用程 序看起來好像沒有反應一樣。相反,任務可以傳遞給工作者線程(word thread)。當工作者線程在繁忙地處理任務的時候,窗口線程可以自由地響應其他用戶的請求。當工作者線程完成任務的時候,它發送信號給窗口線程。窗口 線程便可以更新應用程序窗口,并顯示任務的結果。對用戶而言,這種具有工作者線程設計的程序顯得響應速度更快。

 

從一個單線程的應用到一個多線程的應用并不僅僅帶來好處,它也會有一些代價。不要僅僅為了使用多線程而使用多線程。而應該明確在使用多線程時能多來的好處比所付出的代價大的時候,才使用多線程。如果存在疑問,應該嘗試測量一下應用程序的性能和響應能力,而不只是猜測。

設計更復雜

雖然有一些多線程應用程序比單線程的應用程序要簡單,但其他的一般都更復雜。在多線程訪問共享數據的時候,這部分代碼需要特別的注意。線程之間的交互往往非常復雜。不正確的線程同步產生的錯誤非常難以被發現,并且重現以修復。

上下文切換的開銷

當CPU從執行一個線程切換到執行另外一個線程的時候,它需要先存儲當前線程的本地的數據,程序指針等,然后載入另一個線程的本地數據,程序指針 等,***才開始執行。這種切換稱為“上下文切換”(“context switch”)。CPU會在一個上下文中執行一個線程,然后切換到另外一個上下文中執行另外一個線程。

上下文切換并不廉價。如果沒有必要,應該減少上下文切換的發生。

增加資源消耗

線程在運行的時候需要從計算機里面得到一些資源。除了CPU,線程還需要一些內存來維持它本地的堆棧。它也需要占用操作系統中一些資源來管理線程。 我們可以嘗試編寫一個程序,讓它創建100個線程,這些線程什么事情都不做,只是在等待,然后看看這個程序在運行的時候占用了多少內存。

原文鏈接:http://tutorials.jenkov.com/java-concurrency/benefits.html

譯文鏈接:http://ifeve.com/benefits/

責任編輯:陳四芳 來源: ifeve.com
相關推薦

2009-03-12 10:52:43

Java線程多線程

2021-09-11 15:26:23

Java多線程線程池

2020-08-20 07:54:58

Node多線程解密

2023-06-13 13:39:00

多線程異步編程

2020-10-07 22:21:13

程序員技術線程

2009-07-02 16:36:04

JSP優點ASP優點

2024-01-15 10:55:40

Python多線程開發

2009-07-01 17:34:03

Servlet和JSP

2020-11-17 06:08:40

Redis多線程

2020-12-02 11:00:59

Redis多線程數據庫

2021-06-11 11:28:22

多線程fork單線程

2022-05-27 08:16:37

Thread類Runnable接口

2010-03-18 16:02:09

python 多線程

2021-04-20 12:39:52

Node.js多線程多進程

2010-03-15 14:33:09

Python線程編程

2009-08-21 11:31:59

異步和多線程的區別

2010-07-26 09:45:09

Perl多進程

2021-08-04 23:30:28

Node.js開發線程

2014-12-08 10:37:54

HTTPS

2019-10-30 21:27:51

Java中央處理器電腦
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九色 在线| 99免费精品视频 | 国精产品一品二品国精在线观看 | 久久久久久国产精品mv | 精品成人佐山爱一区二区 | 欧美黑人激情 | 国产精品亚洲一区二区三区在线 | 欧美色a v | 国产精品日韩欧美一区二区三区 | 国产精品99久久久久久久vr | 欧美一区二区三区一在线观看 | 精品国产乱码久久久 | 亚洲国产欧美一区 | 国产农村妇女精品一区 | 久久久久久九九九九 | 国产香蕉视频在线播放 | 国产精品一区二区av | 在线日韩av电影 | 国产在线视频在线观看 | 午夜久久久 | 亚洲色综合 | 午夜精品影院 | 精品一区二区电影 | 国产视频中文字幕在线观看 | 久久久不卡网国产精品一区 | 91在线免费视频 | 久草视频在 | 亚洲一区国产 | 久久久久久高潮国产精品视 | 亚洲成人免费 | 欧美a√| 一区二区不卡视频 | 午夜影院在线观看免费 | 欧美精品在线一区二区三区 | 日韩一区二区在线视频 | 美女艹b| av电影手机版 | 国产欧美日韩一区 | 国产精品日日摸夜夜添夜夜av | 蜜桃免费av| 久久国产精品99久久久大便 |