什么是線程?
1.1 什么是線程
線程是操作系統能夠進行運算調度的基本單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。和進程類似,一個線程也有就緒、運行、阻塞三種基本轉狀態。
線程是處理機的獨立調度單位,多個線程可以并發執行。每個線程都應有一個唯一的標示符和線程控制塊。線程控制塊記錄了線程執行的寄存器和棧等現場狀態。
1.2 時間片
時間片是分時操作系統分配給每個正在運行的進程微觀上的一段CPU時間,時間片的大小對系統的性能影響很大。
如果時間片足夠大,以至于所有進程都能在一個時間片內執行完畢,則時間片輪轉調度算法就退化為先來先服務調度算發。如果時間片很小,那么處理機將在進程間過于頻繁切換,使處理機的開銷增大,而真正用于處理用戶作業的時間將減少,因此時間片的大小應選擇適當。
1.3 線程安全
線程不持有資源,但是同一進程中的所有線程可以共享進程的資源,所以說我們遇到的大部分線程的問題基本是因為共享資源引起的。
也就是說,當多個線程同時訪問一塊共享資源(某一塊內存),因為時序性問題,會導致數據錯亂,這就是線程不安全。
1.4 同步、異步
同步:在發出一個同步調用時,在沒有得到結果之前,該調用就不返回。
異步:在發出一個異步調用后,調用者不會立刻得到結果,該調用就返回了。
1.5 并發,并行
并發是同一個時間段內,幾個作業都在同一個CPU上運行,但任意一個時刻點上只有一個作業在處理機上運行。
并行是同一個時間段內,幾個作業在幾個CPU上運行,任意一個時刻點上,有多個作業在同時運行,并且多個作業之間互不干擾
什么是線程
線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發多個線程,每條線程并行執行不同的任務。
線程是獨立調度和分派的基本單位。線程可以為操作系統內核調度的內核線程,如Win32線程;由用戶進程自行調度的用戶線程,如Linux平臺的POSIX Thread;或者由內核與用戶進程,如Windows 7的線程,進行混合調度。
同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。
一個進程可以有很多線程,每條線程并行執行不同的任務。
線程特點
1、輕型實體
線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源。線程的實體包括程序、數據和TCB。線程是動態概念,它的動態特性由線程控制塊TCB(Thread Control Block)描述。
2、獨立調度和分派的基本單位
在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由于線程很“輕”,故線程的切換非常迅速且開銷小(在同一進程中的)。
3、可并發執行
在一個進程中的多個線程之間,可以并發執行,甚至允許在一個進程中所有線程都能并發執行;同樣,不同進程中的線程也能并發執行,充分利用和發揮了處理機與外圍設備并行工作的能力。
4、共享進程資源
在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的地址空間(進程的地址空間),這意味著,線程可以訪問該地址空間的每一個虛地址。
此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。由于同一個進程內的線程共享內存和文件,所以線程之間互相通信不必調用內核。
什么是線程?
線程(英文:thread),臺灣地區譯為執行緒(英文:thread ofexecution)、緒程,操作系統技術中的術語,是操作系統能夠進行運算調度的最小單位,它被包涵在進程之中,是行程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并行多個線程,每條線程并行執行不同的任務。在Unix SystemV及SunOS中也被稱為輕量進程(lightweight process),但輕量進程更多指內核線程(kernel thread),而把用戶線程(ur thread)稱為線程。計算機科學術語,指運行中的程序的調度單位。
線程具有以下屬性。
1)輕型實體
線程中的實體基本上不擁有系統資源,只是有一點必不可少的、能保證獨立運行的資源,比如,在每個線程中都應具有一個用于控制線程運行的線程控制塊TCB,用于指示被執行指令序列的程序計數器、保留局部變量、少數狀態參數和返回地址等的一組寄存器和堆棧。
2)獨立調度和分派的基本單位。
在多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調度和分派的基本單位。由于線程很“輕”,故線程的切換非常迅速且開銷小。
3)可并發執行。
在一個進程中的多個線程之間,可以并發執行,甚至允許在一個進程中所有線程都能并發執行;同樣,不同進程中的線程也能并發執行。
4)共享進程資源。
在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現在:所有線程都具有相同的地址空間(進程的地址空間),這意味著,線程可以訪問該地址空間的每一個虛地址;此外,還可以訪問進程所擁有的已打開文件、定時器、信號量機構等。
什么是線程?有什么用 講得通俗點
1、線程的定義
線程,有時被稱為輕量進程(Lightweight Process,LWP),是程序執行流的最小單元。
線程,在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的并發請求,為每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。
線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。
2、線程的作用:
線程的作用很多,舉個最為典型的例子:
當需要在網絡上放一個服務端,一個客戶端訪問時,就會新建一個線程處理這個客戶端的事務,這樣的話只要不斷新建線程就可以處理多個用戶的請求了。
擴展資料
線程的五種狀態:
1、新生狀態(New)
當一個線程的實例被創建即使用new關鍵字和Thread類或其子類創建一個線程對象后,此時該線程處于新生狀態。 此時線程不是活著的(not alive);
2、就緒狀態(Runnable)
通過調用線程實例的start()方法來啟動線程使線程進入就緒狀態;但還沒有被分配到CPU,處于線程就緒隊列;此時線程是活著的(alive)。
3、運行狀態(Running)
一旦獲取CPU,線程就進入運行狀態,線程的run()方法才開始被執行,如果在給定的時間內沒有執行結束,就會被系統給換下來回到線程的就緒狀態,此時線程是活著的(alive)。
4、阻塞狀態(Blocked)
通過調用join()、sleep()、wait()或者資源被暫用使線程處于阻塞狀態,此時線程是活著的(alive)。
5、死亡狀態(Dead)
當一個線程的run()方法運行完畢或被中斷或被異常退出,該線程到達死亡狀態。處于Dead狀態調用start()方法,會出現異常。
參考資料:百度百科-線程
什么是線程?
線程是指程序的一個指令執行序列,WIN32 平臺支持多線程程序,允許程序中存在多個線程。 在單 CPU 系統中,系統把 CPU 的時間片按照調度算法分配給各個線程,因此各線程實際上是分時執行的,在多 CPU 的 Windows NT 系統中, 同一個程序的不同線程可以被分配到不同的 CPU 上去執行。由于一個程序的各線程是在相同的地址空間運行的,因此設及到了如何共享內存, 如何進行線程通信等問題,這樣便需要處理各線程之間的同步問題,這是多線程編程中的一個難點。
什么是線程??
是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。
線程是程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不同的工作,稱為多線程.
線程和進程的區別在于,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文.多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定. 線程的運行中需要使用計算機的內存資源和CPU
線程的周期
新建 就緒 運行 阻塞 死亡
線程調度與優先級
有線程進入了就緒狀態,需要有線程調度程序來決定何時執行,根據優先級來調度.
線程組
每個線程都是一個線程組的一個成員,線程組把多個線程集成一個對象,通過線程組可以同時對其中的多個線程進行操作.在生成線程時必須將線程放在指定的線程組,也可以放在缺省的線程組中,缺省的就是生成該線程的線程所在的線程組.一旦一個線程加入了某個線程組,不能被移出這個組.
守護線程
是特殊的線程,一般用于在后臺為其他線程提供服務.
isDaemon():判斷一個線程是否為守護線程.
t Daemon():設置一個線程為守護線程.
Thread類和Runnable接口
Thread類
類Thread在包java.lang中定義,它的構造方法如下:
public Thread();
public Thread(Runnable target);
public Thread(Runnable target,String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group, String name);
主要方法
isActive() 判斷是否處于執行狀態
Suspend() 暫停執行
reSume 恢復執行
start() 開始執行
Stop() 停止執行
sleep() 睡眠
run() 程序體
yield() 向其他線程退讓運行權
線程優先級
Public statuc final int MAX_PRIORITY最高優先級,10
Public statuc final int MIN_PRIORITY最低優先級,1
Public statuc final int NORM_PRIORITY普通優先級,5
Runnable接口
Runnable接口中只定義了一個方法run()作為線程體,
void run()
Java的線程是通過java.lang.Thread類來實現的。
VM啟動時會有一個由主方法(public static void main(){})所定義的線程。
可以通過創建Thread的實例來創建新的線程。
每個線程都是通過某個特定的Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。
通過調用Thread類的start()方法來啟動一個線程
Java里面實現多線程,有2個方法
1 繼承 Thread類,比如
class MyThread extends Thread {
public void run() {
// 這里寫上線程的內容
}
public static void main(String[] args) {
// 使用這個方法啟動一個線程
new MyThread().start();
}
}
2 實現 Runnable接口
class MyThread implements Runnable{
public void run() {
// 這里寫上線程的內容
}
public static void main(String[] args) {
// 使用這個方法啟動一個線程
new Thread(new MyThread()).start();
}
}
一般鼓勵使用第二種方法,應為Java里面只允許單一繼承,但允許實現多個接口。第二個方法更加靈活。