關於執行緒一些知識點和總結
今天剛剛學習到,人生需要積累,於是把自己每天的學習到的都記錄起來,相信有一天會成為自己寶貴的財富,廢話不多說 直接貼知識點:
1.何為程序
在Android中的App通常會執行在一個獨立的程序中,通常會在正在執行的程式理解為一個程序
每一個程序都有一個獨立的記憶體空間,不能共存記憶體空間,對於一個多操作的系統,程序是可以併發的執行的
2.何為執行緒
執行緒是程序中的最小單位,是一個順序執行的流,在同一個程序中執行緒可以共享同一塊記憶體空間
執行緒是是可以併發執行的
3.為何併發?
a)巨集觀(並行)
b)微觀(序列 順序 會輪流執行)
4。多執行緒的應用優點和劣勢
優勢:
a)多執行緒的運用可以提高使用者的體驗
劣勢:
a)多執行緒的運用 會使編碼難度加大,及除錯的難度
5.Android中的執行緒建立和相關狀態
相關狀態:
1.建立狀態(new Thread)
2.就緒狀態(start 。。。。)
3.執行狀態 (run )
4.阻塞狀態 (sleep)
5.死亡狀態 (run方法結束完)
相關方法:
1.start 啟動執行緒,讓執行緒進入就緒狀態
2.run 執行執行緒
3.sleep 暫停狀態,讓出cup
4.join 讓呼叫此方法的 執行緒 優先執行
5.setDeamon 設定為守護執行緒,當沒有其他執行緒是,會自動終止執行
6.interruput 喚醒正在睡眠的執行緒
7.isalive 判斷執行緒是否終止
8.getName 獲取執行緒名
9.currentThread 獲取當前執行緒
10.setpriority 設定執行緒優先順序
6.Android 執行緒同步
執行緒同步是多個程序對共享資料集上的互斥和協作 ,保證資料的安全,和業務合理的一種實現
1)互斥是讓對個執行緒判對進行
a)同步程式碼塊 synchronized 關鍵字
同步的方法:
靜態:static synchronize method()
非靜態: synchronize method方法
下面是一個關於消費者和生產者案例:
package day14;
class Container{
private Object[] array;
/**記錄有效元素個數(放的資料的個數)*/
private int size;
public Container(int cap) {
array=new Object[cap];
}
/**放資料*/
public synchronized void put(Object obj){
//1.判定容器是否已滿,滿了則等待.
while(array.length==size)
try{this.wait();}catch(Exception e){}
//2.沒滿則放資料
array[size]=obj;//addLast
//3.修改有效元素個數
size++;
//4.通知消費者取資料
this.notifyAll();
}
/**取資料*/
public synchronized Object take(){
//1.判定容器是否為空,空則等待
while(size==0)
try{this.wait();}catch(Exception e){}
//2.容器不為空,則取資料
Object obj=array[0];//removeFirst
//3.移動元素
if(size>1){
System.arraycopy(array, 1, array, 0, size-1);
}
//4.修改有效元素個數
size--;
//5.通知生產者繼續放資料(通知具備相同鎖物件,並且處於等待狀態的執行緒)
this.notifyAll();//此時會釋放鎖嗎?不會釋放
return obj;
}
}
/**生產者*/
class Producer extends Thread{
private Container container;
public Producer(Container container) {
this.container=container;
}
@Override
public void run() {
int i=1;
while(true){
container.put(i++);
//try{sleep(500);}catch(Exception e){}
}
}
}
/**消費者*/
class Consumer extends Thread{
private Container container;
public Consumer(Container container) {
this.container=container;
}
@Override
public void run() {
while(true){
Object obj=container.take();
System.out.println(obj);
//try{sleep(500);}catch(Exception e){}
}
}
}
public class ThreadCommunication01 {
public static void main(String[] args) {
//容器物件
Container c=new Container(5);
//生產者執行緒物件
Producer pro=new Producer(c);
//消費者執行緒物件
Consumer con=new Consumer(c);
pro.start();
con.start();
}
}