關於線程啓動

1、線程與進程:


線程(Thread):程序中的一條執行路徑,如果有多條路徑,就是多線程


進程(Process):每個獨立運行的程序


2、線程的創建


1)、繼承java.lang.Thread類,重寫run方法


2)、實現java.lang.Runnable接口,重寫run方法


啓動線程,調用Start方法,而不是直接調用run方法


run方法是線程體,啓動線程執行run方法


3、線程的調度
1)、sleep(毫秒數),線程休眠,1秒=1000毫秒


2)、yield(),線程讓步,暫停當前正在執行的線程,執行其他線程


3)、join(),線程加入或線程合併,等待加入的線程執行結束,再執行其他線程


4、線程的停止
1)、stop(),強行停止正在執行的線程,已過時,不建議使用
2)、interrupt(),中斷線程,表示線程中斷過,給線程加中斷標記
interrupted(),表示線程中斷的狀態,true表示中斷,否則爲false
3)、設置退出標記,使線程終止


5、線程的狀態以及轉換
創建:實例化線程類對象
就緒:線程類對象調用start方法,進入就緒狀態,等待cpu時間片
運行:線程獲得cpu的時間片,進入運行狀態,執行run方法
阻塞:在線程運行過程中,出現阻塞事件,進入阻塞狀態,當阻塞狀態 解除,進入就緒狀態
sleep,線程休眠-->休眠時間結束
join,線程加入-->加入的線程執行結束
wait,線程等待-->notifyAll,notify,喚醒
終止:線程執行結束。


6、線程優先級
優先級高獲得cpu的時間片多,運行機會多
最大:MAX_PRIORITY:10
最小:MIN_PRIORITY:1
默認:NORM_PRIORITY:5


7、守護線程
用戶線程,User Thread,前臺線程
守護線程,Daemon Thread,後臺線程,駐留後臺的程序


如果用戶線程已經全部退出,只剩下守護線程,因爲沒有了被守護的線程,守護線程沒有工作可做,沒有存在的必要,退出。


例子1:
word錄入,在錄入的過程中,會檢查拼寫錯誤,錄入有人工手動錄入(用戶線程),而錯誤檢查,由後臺執行(守護線程),當word關閉,用戶線程執行結束,守護線程也結束


例子2:
有一個城堡,站崗的士兵(守護線程),城堡的主人(用戶線程),當城堡主人搬家走人,士兵也跟着搬家走人


8、線程同步機制
多個線程併發執行,同時請求同一個資源,會導致數據不安全。
由於資源共享,解決方法:
1)、同步機制
2)、使用局部變量


9、
同步:A線程請求某個資源,但是該資源被B線程使用着,如果使用同步機制,A線程請求不到該資源,只能等待,等待B線程釋放資源


異步:A線程請求某個資源,但是該資源被B線程使用着,如果使用異步機制,A線程無需等待,可以請求到該資源


10、同步機制,synchronized
1)、同步方法,使用關鍵字修飾方法
2)、同步代碼塊,synchronized(mutex){}


mutex:互斥體,當一個線程持有一個互斥體時,其他線程也申請訪問同一個互斥體的資源時,會被阻塞,因此,可以使用互斥體保證資源的互斥訪問,也就是說一個資源在同一時間只能由一個線程訪問


mutex:是引用類型,鎖定this,代表線程類對象
同步方法鎖定對象,也是this


靜態同步方法,鎖定不是this,而是類,例如:Sale.class
原因:靜態方法隨着類的加載而加載,此時線程類對象還沒有創建,並不存在,不可能是this,但是在內存中已經存在當前類,是Class類型




預習:
死鎖
生產者消費者


總結:
1、線程創建
2、線程調度,sleep,yield,join
3、線程狀態以及轉換
4、守護線程

5、線程同步機制


/**
 * 實現java.lang.Runnable接口,實現多線程
 * 
 * @author Administrator
 * 
 */
public class Demo02 {
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.start();
for (int i = 0; i < 1000; i++) {
System.out.println("main:" + i);
}
}
}


class MyThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 1000; i++) {
System.out.println("MyThread:" + i);
}
}
}


/**
 * 繼承java.lang.Thread類
 * 
 * @author Administrator
 * 
 */
public class Demo03 {
public static void main(String[] args) {
MyThread02 mt = new MyThread02();
mt.start();
for (int i = 0; i < 100; i++) {
System.out.println("main:" + i);
}
}
}


class MyThread02 extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
System.out.println("MyThread:" + i);
}
}
}



/**
 * 使用匿名內部類創建多線程
 * 
 * @author Administrator
 * 
 */
public class Demo04 {
public static void main(String[] args) {
new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("MyThread01:" + i);
}
}
}.start();


new Thread(new Runnable() {


@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 1000; i++) {
System.out.println("MyThread02:" + i);
}
}
}).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main:" + i);
}
}
}


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