寫在前面
一切技術(shù)都是紙老虎,技術(shù)就是一層膜,捅破了就什么也不是
多線程兩種完成方式
繼承Thread類,完成run辦法將需求多線程啟動的功用代碼放在run辦法內(nèi)該方式有isinterrupted標志位,
能夠依據(jù)該標志位在另一個可以獲取到該線程的代碼塊中that.interrupt完成中綴,但是能否真的中綴則由that線程決議
完成runnable接口,覆寫run辦法將需求多線程啟動的功用代碼放在run辦法內(nèi),留意這里沒有isInterrupted標志位
實踐上在一個線程中中止另一個線程能夠用concurrent包中的cancel辦法,這個跟python幾乎一毛一樣啊啊啊
ExecutorService接口下固定大小線程池(Fixed),動態(tài)變化(Cached),以及只要單個(Single)線程的線程池
//t1.start()永遠運用start–》start0(本中央法)去啟動線程而非調(diào)用run辦法
//這里記得t1.join()是等候t1線程執(zhí)行完成才會繼續(xù)往下執(zhí)行
//t1.setDaemon(true)設(shè)置為守護線程,也就是不那么重要的,JVM在一切非守護線程執(zhí)行完成后就會退出,渣滓回收就是一個守護線程
//固然我們以后運用concurrent包來停止并發(fā),但是根底原理一定要控制結(jié)實
//進程六種狀態(tài)
NEW:新建狀態(tài)剛剛創(chuàng)立出來,還沒有調(diào)用start辦法之前的狀態(tài)。
RUNNABLE:可運轉(zhuǎn)狀態(tài),可能正在執(zhí)行,也可能不是正在執(zhí)行,只要在該種狀態(tài)下的線程才有資歷搶CPU。
BLOCKED:鎖阻塞狀態(tài)線程要等候另一個線程釋放鎖對象。
WAITING:無限等候線程調(diào)用了wait()辦法進入的狀態(tài),需求其它線程調(diào)用notify辦法喚醒。
TIMED_WAITING:計時等候狀態(tài)線程調(diào)用了sleep辦法獲wait(longtime)辦法進入的狀態(tài)。
TERMINATED:死亡狀態(tài)線程任務(wù)執(zhí)行終了或調(diào)用了stop辦法。
Thread常用辦法
結(jié)構(gòu)辦法Thread(Runnabletarget,Stringname)
靜態(tài)辦法:
Thread.currentThread().getName()
Thread.sleep(1000)//java中單位是毫秒所以1000ms=1s,python中直接是秒
線程平安同步機制synchronized同步代碼快,同步辦法,可重入鎖,可重入讀寫鎖
參加synchronized同步辦法,synchronized這個方式不如可重入鎖平安,被synchronized修飾的要么取得鎖,要么永遠等候下去
publicclassCounter{
privateintvalue;
publicsynchronizedvoidinc(intm){
this.value+=m;
}
publicsynchronizedvoiddec(intm){
this.value-=m;
}
}
引入可重入鎖即能夠在同一個線程內(nèi)屢次獲取該鎖
packagecom.ghc.test;
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
publicclassCounter{
privateLocklock=newReentrantLock();
privateintvalue;
publicvoidinc(intm){
if(lock.tryLock()){
try{
this.value+=m;
}finally{
lock.unlock();
}
}
}
publicvoiddec(intm){
if(lock.tryLock()){
try{
this.value-=m;
}finally{
lock.unlock();
}
}
}
publicintgetValue(){
lock.lock();
try{
returnthis.value;
}finally{
lock.unlock();
}
}
publicstaticvoidmain(String[]args)throwsInterruptedException{
System.out.println(Thread.currentThread().getName()+”start…”);
newThread(()->{
System.out.println(Thread.currentThread().getName()+”start…”);
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){}
System.out.println(Thread.currentThread().getName()+”end…”);
},”downloadthread”).start();
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+”end…”);
}
}
引入可重入讀寫鎖,由于能夠同時讀,不可同時寫入或者說不可同時讀寫
引入可重入讀寫鎖在同時寫入的時分會加鎖停止同步,而在同時讀取的時分則不會進步并發(fā)性能
packagecom.ghc.test;
importjava.util.concurrent.locks.ReentrantReadWriteLock;
publicclassCounter{
privatefinalReentrantReadWriteLocklock=newReentrantReadWriteLock();
privatefinalReentrantReadWriteLock.ReadLockreadLock=lock.readLock();
privatefinalReentrantReadWriteLock.WriteLockwriteLock=lock.writeLock();
privateintvalue;
publicvoidinc(intm){
//寫鎖
writeLock.lock();
try{
this.value+=m;
}finally{
writeLock.unlock();
}
}
publicvoiddec(intm){
//讀鎖
readLock.lock();
try{
this.value-=m;
}finally{
readLock.unlock();
}
}
}
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號