線程概念
併發:就是無因果關聯。即若一個系統內部發生的兩個事件無因果聯繫,則稱此兩個事件是併發的。
並行:多個程序在同一時刻同時執行。在物理上必須具備多臺處理機。而併發是指多個程序在同一時間段同時執行。
線程:實現了進程內部的併發執行;是進程內部可併發執行的代碼段。
併發程序的不確定性:由於進程內部的各個線程共享進程的數據區,對數據區操作順序不確定,使得數據區中的值不確定。
爲什麼線程的執行效率比進程的執行效率高?
處理機控制權在進程間切換時線程比進程快,why?因爲進程的創建需要創建專有的數據區,而線程不用(線程只是個代碼段);進程切換時需要先保存當前進程數據區,然後恢復另一個進程專有數據區。
不確定性實例:
public class Demo {
public static void main(String[] args) throws Exception {
System.out.print("Main開始");
TestThread T1=new TestThread("奇數線程", 1);
TestThread T2=new TestThread("偶數線程", 2);
T1.start(); T2.start();
System.out.print("當前有"+Thread.activeCount()+"個線程");
System.out.print("Main結束");
}
}
class TestThread extends Thread{
private int d;
public TestThread(String name, int d) {
// TODO Auto-generated constructor stub
super(name);
this.d=d;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=d; i<500; i+=2){
System.out.print(" "+i);
}
System.out.print(this.getName()+"結束!");
}
}
語法機制
支持併發的基本語法機制主要集中在:Thread類Runnable接口Object類以及Synchronized修飾。
Thread類封裝了:創建 操控 和 管理線程的手段;
Object類提供了線程通信機制;
Runable接口和Synchronized修飾則對線程應用能力進行了拓展。
線程狀態和生命週期
線程狀態
NEW(新建態):線程對象已經創建但還沒有調用start()方法;
RUNNABLE(運行態):調用了start()方法,線程正在運行,或者正在等待處理機時間片;
BLOCKED(阻塞態):正在獲取監控鎖,等待進入臨界資源;
WAITING(等待態):執行wait()或wait(0)之後的狀態;
TIME_WAITING(有時間的等待):和WAITING相似,區別在於等待是有時間限制的;
TERMINATED(終止態):線程執行結束。