多線程學習第一篇(一些概念性的問題)

第一題:線程的基本概念、線程的基本狀態及狀態之間的關係?

線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒阻塞運行三種基本狀態。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
線程的基本狀態(以java爲例子):

Java中的線程的生命週期大體可分爲5種狀態。

NEW:這種情況指的是,通過New關鍵字創建了Thread類(或其子類)的對象

RUNNABLE:這種情況指的是Thread類的對象調用了start()方法,這時的線程就等待時間片輪轉到自己這,以便獲得CPU;第二種情況是線程在處於RUNNABLE狀態時並沒有運行完自己的run方法,時間片用完之後回到RUNNABLE狀態;還有種情況就是處於BLOCKED狀態的線程結束了當前的BLOCKED狀態之後重新回到RUNNABLE狀態。

RUNNING:這時的線程指的是獲得CPURUNNABLE線程,RUNNING狀態是所有線程都希望獲得的狀態。

DEAD:處於RUNNING狀態的線程,在執行完run方法之後,就變成了DEAD狀態了。

BLOCKED:這種狀態指的是處於RUNNING狀態的線程,出於某種原因,比如調用了sleep方法、等待用戶輸入等而讓出當前的CPU給其他的線程。


處於RUNNABLE狀態的線程變爲BLOCKED狀態的原因,除了該線程調用了sleep方法、等待輸入原因外,還有就是在當前線程中調用了其他線程的join方法、當訪問一個對象的方法時,該方法被鎖定等。

相應的,當處於BLocked狀態的線程在滿足以下條件時就會由該狀態轉到RUNNABLE狀態,這些條件是:sleep的線程醒來(sleep的時間到了)、獲得了用戶的輸入、調用了join的其他線程結束、獲得了對象鎖。

一般情況下,都是處於RUNNABLE的線程和處於RUNNING狀態的線程,互相切換,直到運行完run方法,線程結束,進入DEAD狀態。資源。

第二題:線程與進程的區別?

1.進程是應用程序在處理機上的一次執行,他是一個動態的概念,而線程是進程的一部分,進程包含多個進程運行。

2。線程是cpu調度和分派的基本單位。線程自己基本上不擁有資源,只擁有系統中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可以和同屬於以個進程的線程共享資源(也就是多個線程共享同一塊內存)。
3.當進程退出時,所屬的線程就全部退出。

引入線程帶來的主要好處:

(1) 在進程內創建、終止線程比創建、終止進程要快;

(2) 同一進程內的線程間切換比進程間的切換要快,尤其是用戶級線程間的切換。

第三題:多線程有幾種實現方法,都是什麼?

多線程(jave中)
    1. 繼承 Thread 類
    2. 實現 Runnable 接口再 new Thread(YourRunnableOjbect) 
線程同步
    1. 用 synchronized 修飾需要同步的方法 
    2. 用 synchronized 塊包圍需要同步的語句 

在Windows中,線程同步機制可以通過臨界區、互斥量、信號量、事件來實現,還可以使用消息循環。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章