線程與進程區別
每一個正在系統上運行的程序都是一個進程。每一個進程包含一到多個線程。線程是一組指令的集合,或者是程序的特殊段,它能夠在程序裏獨立執行。也能夠把它理解爲代碼運行的上下文。因此線程基本上是輕量級的進程,它負責在單個程序裏執行多任務。一般由操做系統負責多個線程的調度和執行。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.多線程建立方式?
答:繼承Thread或Runnable 接口。
4.是繼承Thread類好仍是實現Runnable接口好?
答:Runnable接口好,由於實現了接口還能夠繼續繼承。繼承Thread類不能再繼承。
5.你在哪裏用到了多線程?
答:主要能體現到多線程提升程序效率。
舉例:分批發送短信、迅雷多線程下載等。
原文出處:https://www.cnblogs.com/coderwsp/p/10792670.html