併發編程之多線程基礎篇及面試

線程與進程區別

每一個正在系統上運行的程序都是一個進程。每一個進程包含一到多個線程。線程是一組指令的集合,或者是程序的特殊段,它能夠在程序裏獨立執行。也能夠把它理解爲代碼運行的上下文。因此線程基本上是輕量級的進程,它負責在單個程序裏執行多任務。一般由操做系統負責多個線程的調度和執行。html

使用線程能夠把佔據時間長的程序中的任務放到後臺去處理,程序的運行速度可能加快,在一些等待的任務實現上如用戶輸入、文件讀寫和網絡收發數據等,線程就比較有用了。在這種狀況下能夠釋放一些珍貴的資源如內存佔用等等。java

若是有大量的線程,會影響性能,由於操做系統須要在它們之間切換,更多的線程須要更多的內存空間,線程的停止須要考慮其對程序運行的影響。一般塊模型數據是在多個線程間共享的,須要防止線程死鎖狀況的發生。面試

總結:進程是全部線程的集合,每個線程是進程中的一條執行路徑。數據庫

 

多線程應用場景?

 

:主要能體現到多線程提升程序效率。網絡

 

舉例: 迅雷多線程下載、數據庫鏈接池、分批發送短信等。多線程

 

多線程建立方式

第一種繼承Thread類 重寫run方法

第二種實現Runnable接口,重寫run方法

第三種匿名內部類方式

 

使用繼承Thread仍是使用實現Runnable接口好?性能

 使用實現實現Runnable接口好,緣由實現了接口還能夠繼續繼承,繼承了類不能再繼承spa

啓動線程是使用調用start方法仍是run方法?

開始執行線程 注意 開啓線程不是調用run方法,而是start方法操作系統

 

線程運行狀態

 

 線程從建立、運行到結束老是處於下面五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態。.net

 

狀態

 

   當用new操做符建立一個線程時, 例如new Thread(r),線程尚未開始運行,此時線程處在新建狀態。 當一個線程處於新生狀態時,程序尚未開始運行線程中的代碼

 

就緒狀態

 

一個新建立的線程並不自動開始運行,要執行線程,必須調用線程的start()方法。當線程對象調用start()方法即啓動了線程,start()方法建立線程運行的系統資源,並調度線程運行run()方法。當start()方法返回後,線程就處於就緒狀態。

 

     處於就緒狀態的線程並不必定當即運行run()方法,線程還必須同其餘線程競爭CPU時間,只有得到CPU時間才能夠運行線程。由於在單CPU的計算機系統中,不可能同時運行多個線程,一個時刻僅有一個線程處於運行狀態。所以此時可能有多個線程處於就緒狀態。對多個處於就緒狀態的線程是由Java運行時系統的線程調度程序(thread scheduler)來調度的。

運行狀態

當線程得到CPU時間後,它才進入運行狀態,真正開始執行run()方法.

 

阻塞狀態

    線程運行過程當中,可能因爲各類緣由進入阻塞狀態:
        1>線程經過調用sleep方法進入睡眠狀態;
        2>線程調用一個在I/O上被阻塞的操做,即該操做在輸入輸出操做完成以前不會返回到它的調用者;
        3>線程試圖獲得一個鎖,而該鎖正被其餘線程持有;
        4>線程在等待某個觸發條件;

 

死亡狀態

 

有兩個緣由會致使線程死亡:
  1) run方法正常退出而天然死亡,
   2) 一個未捕獲的異常終止了run方法而使線程猝死。
  爲了肯定線程在當前是否存活着(就是要麼是可運行的,要麼是被阻塞了),須要使用isAlive方法。若是是可運行或被阻塞,這個方法返回true; 若是線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false.

 

面試:

1.進程與線程的區別?

:進程是全部線程的集合,每個線程是進程中的一條執行路徑,線程只是一條執行路徑。

2.爲何要用多線程?

 :提升程序效率

3.多線程建立方式?

  :繼承ThreadRunnable 接口。

4.是繼承Thread類好仍是實現Runnable接口好?

:Runnable接口好,由於實現了接口還能夠繼續繼承。繼承Thread類不能再繼承。

5.你在哪裏用到了多線程?

:主要能體現到多線程提升程序效率。

舉例:分批發送短信、迅雷多線程下載等。

原文出處:https://www.cnblogs.com/coderwsp/p/10792670.html

相關文章
相關標籤/搜索