一共兩種建立方法,一:
public
class
thread
}public
inte***ce
runnable()
}//下面是自己要實現的
class
bimplements
runnable
}thread t1=new thread(new b());
//什麼時候執行我們無法控制,甚至順序都可能改變
t1.start();
第二鐘建立方法
public
class
mythread
extends
threads
//使用匿名類,匿名類沒有建構函式
//但是可以加一對{}作為初始化函式
//怎樣呼叫父類的建構函式呢?那個()就是那個意思了
thread t1=new thread()
public
void
run()[
}};t1.start();
//實現介面,
thread t1=new thread(new runnable()
public
void
run()[
}});
t1.start();
強行終止執行緒 t.stop();
掛起執行緒 t.suspend();
繼續工作 t.resume();
執行緒狀態:running,ready
thread.sleep(1000);
這是靜態函式,讓執行到這行**的那個程式停一下
thread.yield();
也是靜態,從running變成ready一下,讓別的程序跑會
同步**,使用synchronized物件鎖,任何乙個物件其實都有乙個隱含的物件鎖,通過鎖來保護共享資料lock不止可以加在物件上,也可以加在**段上
public
class
twolock
void b()
}void c()
void d()
1.同步洩露 ,訪問共享資料的**有些加鎖有的沒加鎖原子的操作,不可分割的2.共享資料往往是類的成員變數
3.但是對函式內的新的區域性變數都是不需要加在鎖內的
4.同步**會使速度變慢,盡量少用
這個可以直接用來修飾共享資料,這樣其他函式對它的操作一定是被保護的,但是只是對與簡單的操作,比如就簡單的讀寫操作才可以。複雜的函式volatile就沒效果了,所以還是要用sync
synchronized
public
void
push(char c)
//我這裡使用new byte[0].wait()不可以,因為wait和notify函式是定義在物件上的,我可以呼叫任何乙個物件讓它等待
//我這裡直接使用new byte[0].wait()不可以,因為呼叫wait一定要持有這個物件的鎖,而只有操作它時才能有它的鎖!
}catch(interruptedexception)
}data[index]=c;
index++;
notifyall();
//或者使用notify(),是喚醒這個鎖下的某乙個執行緒,而notifyall()是喚醒這個鎖下的全部執行緒,執行緒會先爭用cpu執行權,然後爭用物件鎖。我們應該都使用nootifyall(),因為儘管效率會有點點低,但總不會**漏掉**執行緒。
}synchronized
public
char
pop()catch(exception e){}
}index--;
notifyall();
return data[index];
}
其實上面的**不好,因為wait的條件其實不一致,是兩夥兒的併發什麼時候可以用notify()?
我們其實應該有兩把鎖,這樣上面**要改寫很多(其實下面的**是有死鎖風險的,需要再有乙個額外的flag去避免死鎖)
重要類:linkedblockingqueue
public
static linkedblockingqueue q=new();
thread t1=new thread()
}};thread t2=new thread()
}};
java 多執行緒 原子操作 一
對於乙個集合 需要在加入之前 執行 先檢查後執行 的步驟以達到 若沒有則新增,若有則不新增 的目的,實行多執行緒以提高效率。notthreadsafe public class listhelper 可惜的是這段 並不能保證能夠正確的完成工作,這是為什麼呢?集合和動作都已經被synchronized...
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...