技術分享:程序和執行緒
程序和執行緒
一、引入
1.程序:每個獨立執行的程式
4.多執行緒:在同一個程序(應用程式)中同時執行多個執行緒
二、區別:
2.執行緒:程式中維繫執行的分支
舉例:人作業系統,吃程序,執行緒:睜眼、用手拿、張嘴吃
3.多程序:在作業系統中同時執行多個程式
執行緒的狀態
一、執行緒狀態的分類
NEW:建立一個執行緒,比如MyThread mt=new MyThread();
RUNNABLE:可執行狀態,比如mt.start();
WAITING/TIMED_WAITING:不可執行狀態,比如MyThread.sleep();
BLOCKED:鎖定狀態,當前執行緒如果被解鎖,還可以再次執行
TERMINATED:終止狀態,執行緒體執行結束
二、設定執行緒的優先順序
1.範圍:1-10
java自帶優先順序引數
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
2.方法
setPriority(int p)/getPriority()
執行緒的同步:
一、引入
當一個程序有多個執行緒時,每個執行緒都會搶佔資源,此時會引發一系列問題,引入同步的概念,可解決這些問題
二、synchronized關鍵字
使用:
1.鎖物件
synchronized(obj){...}或 synchronized(this){...}
2.鎖方法:
修飾符 synchronized 返回值型別 方法名(){....}
死鎖
一、引入
執行緒1鎖住資源A 等待資源B,執行緒2 鎖住資源B等待資源A,兩個執行緒都在等待自己需要的資源,而這些資源被
另外的執行緒鎖住,這些執行緒你等我我等你,誰也不願意讓出資源,這樣死鎖就產生了
解決:在定義鎖時,也就是使用synchronized時,需要考慮當前資源被鎖後,其他資源是否也同時被鎖
生產者與消費者:
一、引入:
生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能持有固定數量的產品,
如果生產者生產了過多的產品,店員叫生產者等一下,
如果店中有空位放產品了再通知生產者繼續生產;
如果店中沒有產品了,店員會告訴消費者等一下,
如果店中有產品了再通知消費者來取走產品。
容器類的執行緒安全:
方法:
List list =Collections.synchronizedList(new ArrayList());
執行緒的建立和啟動
一、建立和啟動的方式
方式1:繼承Thread類
步驟:①建立一個類,繼承Thread
②重寫run方法,該手動匯入
③使用Thread類物件呼叫start()方法啟動
方式2:實現Runnable介面
步驟:①建立一個類,實現Runnable介面
②重寫run()方法,自動提示
③建立一個Runnable子類物件,使用Thread構造器將該物件放入,初始化該Thread物件,呼叫start()方法
二、兩種方式的比較:
三、注意:
1.Thread類在lang包下
2.程式啟動後會建立兩個執行緒,一個是垃圾回收器執行緒,一個是主執行緒,main()方法執行在主執行緒中
3.關於run()方法
①它是執行緒體,啟動一個執行緒,會執行該方法內的程式碼
②啟動執行緒時使用start()方法,此執行緒進入RUNNABLE狀態
③在啟動執行緒時不用呼叫run()方法,因為run()方法沒有實現多執行緒機制
Thread類方法:
執行緒的排程:
一、排程方法:
1.執行緒睡眠:Thread.sleep(long millis) throws interruptedException 方法
使執行緒轉到阻塞狀態
millis引數設定睡眠的時間,以毫秒為單位
當睡眠結束後,就轉為就緒(Runnable)狀態
2.執行緒讓步:
Thread.yield()方法
暫停當前正在執行的執行緒物件,把執行機會讓給相同或者更高優先順序的執行緒
3.執行緒加入:
join()throws InterruptedException 方法
在當前執行緒中呼叫另一個執行緒的join()方法,則當前執行緒轉入WAITING狀態,
直到另一個執行緒執行結束,當前執行緒再由阻塞轉為就緒狀態
二、結束執行緒
1.使用標誌位,較為常用
2.對於sleep或wait中的執行緒,使用interrupt()來終止執行緒