多線程是什麼?
什麼是線程、什麼又是多線程 它們之間有什麼區別呢?
說法一:進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以併發執行
說法二:進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
說法三:多線程共存於應用程序中是現代操作系統中的基本特徵和重要標誌。用過UNIX操作系統的讀者知道進程,在UNIX操作系統中,每個應用程序的執行都在操作系統內核中登記一個進程標誌,操作系統根據分配的標誌對應用程序的執行進行調度和系統資源分配,但進程和線程有什麼區別呢?
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的區別在於:
線程的劃分尺度小於進程,使得多線程程序的併發性搞。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程(Process)是最初定義在Unix等多用戶、多任務操作系統環境下用於表示應用程序在內存環境中基本執行單元的概念。以Unix操作系統為例,進程是Unix操作系統環境中的基本成分、是系統資源分配的基本單位。Unix操作系統中完成的幾乎所有用戶管理和資源分配等工作都是通過操作系統對應用程序進程的控制來實現的。
C、C++、Java等語言編寫的源程序經相應的編譯器編譯成可執行文件後,提交給計算機處理器運行。這時,處在可執行狀態中的應用程序稱為進程。從用戶角度來看,進程是應用程序的一個執行過程。從操作系統核心角度來看,進程代表的是操作系統分配的內存、CPU時間片等資源的基本單位,是為正在運行的程序提供的運行環境。進程與應用程序的區別在於應用程序作為一個靜態文件存儲在計算機系統的硬盤等存儲空間中,而進程則是處於動態條件下由操作系統維護的系統資源管理實體。多任務環境下應用程序進程的主要特點包括:
●進程在執行過程中有內存單元的初始入口點,並且進程存活過程中始終擁有獨立的內存地址空間; ......
多線程的定義是什麼?
線程是一組指令的集合,或者是程序的特殊段,它可以在程序裡獨立執行。也可以把它理觸為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序裡執行多任務。通常由操作系統負責多個線程的調度和執行。
多線程是這樣一種機制,它允許在程序中併發執行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立。線程又稱為輕量級進程,它和進程一樣擁有獨立的執行控制,由操作系統負責調度。
多線程是多任務的特殊形式。通常,有兩種類型的多任務:基於進程和基於線程的多任務。進程本質上是正在執行的程序。因此,基於進程的多任務就是允許您的計算機同時運行兩個或者更多程序的特性。例如,基於進程的多任務允許您在使用電子製表軟件或者瀏覽Internet的同時運行文字處理程序。在基於進程的多任務中,程序是調度程序可以分派的最小代碼單元。
多線程是為了使得多個線程並行的工作以完成多項任務,以提高系統的效率。線程是在同一時間需要完成多項任務的時候被實現的。
使用線程的好處有以下幾點:
·使用線程可以把佔據長時間的程序中的任務放到後臺去處理
·用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度
·程序的運行速度可能加快
·在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較游泳了。在這種情況下我們可以釋放一些珍貴的資源如內存佔用等等。
還有其他很多使用多線程的好處,這裡就不一一說明了。
多線程應用
我們以客戶/服務器應用模式中如何進行服務器程序設計為例,來說明多線程技術的應用。該程序是在DECnet-VAX網絡郵箱上實現的。對於TCP/IP,除了改用捆綁的套接字(socket)來代替DECnet中的網絡郵箱以監視客戶的服務請求外,其他方面基本上是一樣的。
為了簡化說明,假定該服務程序只提供2類功能,分別由函數funcl( )和func2( )來實現。客戶在請求服務時要指明功能號1或2。另外限制需要同時提供服務的客戶數目。
多線程程序的基本設計思想是,為請求服務的每個客戶建立1個線程,專門為該客戶提供服務。限制客戶數目就是限制同時存在的線程數目。這些動態建立的線程對象存放在數組中。通過查找該數組是否有空槽,來決定是否達到最大數目。同時利用該數組來管理這些動態存在的線程及相應的網絡鏈路。整個程序由1個主程序和提供2類服務的2個子程序組成。主程序(主控線程)在完成初始化操作後,開始循環讀取郵箱中的網絡控制信息;在接收到連接請求信息後,主控線程就建立1個新線程,並指定相應的函數作為執行代碼;如果客戶要斷開連接,則主控線程查找到相應的服務線程號,釋放該服務線程使用的網絡鏈路,並刪除此線程。
多線程原理是什麼?
線程可以理解為下載的通道,一個線程就是一個文件的下載通道,多線程也就是同時開起好幾個下載通道.當服務器提供下載服務時,使用下載者是共享帶寬的,在優先級相同的情況下,總服務器會對總下載線程進行平均分配.不難理解,如果你線程多的話,那下載的越快.現流行的下載軟件都支持多線程.. 注:實現多線程的條件是服務器支持,不支持的話……就用"用代理下載"
[編輯本段]原理
多線程下載的原理是這樣的:通常服務器同時與多個用恭連接,用戶之間共享帶寬。如果N個用戶的優先級都相同,那麼每個用戶連接到該服務器上的實際帶寬就是服務器帶寬的N分之一。可以想象,如果用戶數目較多,則每個用戶只能佔有可憐的一點帶寬,下載將會是個漫長的過程。 如果你通過多個線程同時與服務器連接,那麼你就可以榨取到較高的帶寬了。例如原來有10個用戶都通過單一線程與服務器相連,服務器的總帶寬假設為56Kbps,則每個用戶(每個線程)分到的帶寬是5.6Kbps,即0.7K字節/秒。如果你同時打開兩個線程與服務器連接,那麼共有11個線程與服務器連接,而你獲得的帶寬將是56/11*2=10.2Kbps,約1.27K字節/秒,將近原來的兩倍。你同時打開的線程越多,你所獲取的帶寬就越大(原來是這樣,以後每次我都通過1K個線程連接:P)。當然,這種情況下佔用的機器資源也越多。有些號稱“瘋狂下載”的下載工具甚至可以同時打開100個線程連接服務器。
什麼是線程??
線程也被稱為輕量進程計算機科學術語,指運行中的程序的調度單位。
線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的併發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。
在多中央處理器的系統裡,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬於同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程接口來讓進程可以控制自己的線程與各處理器之間的關聯度
什麼是多線程編程
多線程編程技術是Java語言的重要特點。多線程編程的含義是將程序任務分成幾個並行的子任務。特別是在網絡編程中,你會發現很多功能是可以併發執行的。比如網絡傳輸速度較慢、用戶輸入速度較慢,你可以用兩個獨立的線程去完成這兩個功能,而不影響正常的顯示或其它功能。 多線程是與單線程比較而言的,普通的Windows採用單線程程序結構,其工作原理是:主程序有一個消息循環,不斷從消息隊列中讀入消息來決定下一步所要乾的事情,一般是針對一個函數,只有等這個函數執行完之後,主程序才能接收另外的消息來執行。比如子函數功能是在讀一個網絡數據,或讀一個文件,只有等讀完這個數據或文件才能接收下一個消息。在執行這個子函數過程中你什麼也不能幹。但往往讀網絡數據和等待用戶輸入有很多時間處於等待狀態,多線程利用這個特點將任務分成多個併發任務後,就可以解決這個問題。 Java中的線程類 1.擴展java.lang.Thread類,用它覆蓋Thread類的run方法。 2.生成實現java.lang.Runnable接口的類並將其它的實例與java.lang.Thread實例相關聯。 Thread類是負責向其它類提供線程支持的最主要的類,要使用一個類具有線程功能,在Java中只要簡單地從Thread類派生一個子類就可以了擴展Thread類,如printThread.java。 Thread類最重要的方法是run方法。run方法是新線程執行的方法,因此生成java.lang.Thread的子類時,必須有相應的run方法。//PrintThread.javapublic class PrintThread extends Thread//繼承Tread類private int count=0//定義一個count變量用於統計打印的次數並共享變量public static void mainString args//main方法開始PrintThread p=new PrintThread//創建一個線程實例p.start//執行線程for{;;}//主線程main方法執行一個循環,for執行一個死循環count++System.out.printcount+″:Main\n″//主線程中打印count+“main”變量的值,並換行public void run//線程類必須有的run()方法for{;;}count++System.out.printcount+″:Thread\n″ 上面這段程序便是繼承java.lang.Tread並覆蓋run的方法。用Java虛擬機啟動程序時,這個程序會先生成一個線程並調用程序主類的main方法。這個程序中的main方法生成新線程,連接打印“Thread”。在啟動線程之後,主線程繼續打印“Main”。 編譯並執行這個程序,然後立即按“Ctrl+C”鍵中斷程序,你會看到上面所述的兩個線程不斷打印出:XXX:main…..XXX:Thread….XXX代表的是數字,也就是上面count的值。在筆者的機器上,不同時刻這兩個線程打印的次數不一樣,先打印20個main(也就是先執行20次主線程)再打印出50次Thread,然後再打印main…… 提示:為了便於查看該程序的執行結果,你可以將執行結果導入一個文本文件,然後打開這......
多線程編程的好處及在什麼情況下用多線程
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操作時或處理的情況需要花大量的時間等等,比如:讀寫文件、視頻圖像的採集、處理、顯示、保存等。
多線程的程序有什麼好處
資源利用率更好
想象一下,一個應用程序需要從本地文件系統中讀取和處理文件的情景。比方說,從磁盤讀取一個文件需要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秒以後 所有模塊一瞬間看到
而多線程,打開頁面的第一......
java 多線程的併發到底是什麼意思?
zhidao弧baidu.com/question/299404186?&oldq=1
多線程是使用相同對象還是不同對象是由你的程序決定的,並不是由多線程技術決定的。
你傳給線程對象哪個對象他就使用哪個。
什麼是多線程?有什麼作用?
進程中的所有線程共享進程的虛擬地址空間,進程中的線程是並行執行的,系統為每個線程劃分執行時間,
多線程是什麼,有什麼好處呢
舉個例子,你要做飯,你要做的飯是米飯和一個炒菜。
如果是單線程,那麼你可以如下做:
第一種方法:先炒菜,然後開始蒸米飯;
第二種方法:先蒸米飯,等米飯熟了再炒菜;
如果是多線程,那麼你就可以如下做:
先蒸米飯,在蒸米飯的過程中去炒菜。
有些問題的解決用多線程會提高效率,比如上邊的例子。但是有時不會提高效率,反而會影響效率:
比如,你要洗衣服,還打算做家庭作業(假設你是小學生,老師給你佈置的家庭作業)。
如果是單線程:你要麼洗完衣服做作業,要麼做完作業洗衣服。
如果是多線程:你洗一分鐘衣服做一分鐘作業,交叉進行,顯然有些時間都耗在了任務的切換上了。
所以,多線程主要用於,當一個任務需要不佔用資源的等待的時候,可以使用空閒的資源做其他的事情。比如類似於QQ聊天的程序,程序的一個線程一直在等待著看是否有好友發消息過來,而與此同時另一個線程允許你打字並且將自己的消息發送給對方。
以上例子並不是很完美,只是希望能借這些例子對多線程有所理解。