停止線程的方法:
1 stop方法颜懊。
2 run方法結(jié)束敞斋。
怎么控制線程的任務(wù)結(jié)束呢丹墨?
任務(wù)中都會(huì)有循環(huán)結(jié)構(gòu),只要控制住循環(huán)就可以結(jié)束任務(wù)兢仰。
控制循環(huán)通常就用定義標(biāo)記來完成(變量flag)乍丈。
但是如果線程處于凍結(jié)狀態(tài),無法讀取標(biāo)記把将。如何結(jié)束呢轻专?
可以使用interrupt()方法將線程從凍結(jié)狀態(tài)強(qiáng)制恢復(fù)到運(yùn)行狀態(tài)中來,讓線程具備cpu的執(zhí)行資格察蹲。
但是強(qiáng)制動(dòng)作會(huì)發(fā)生了InterruptedException请垛,記得要處理。
class StopThread implements Runnable{
private boolean flag=true;
public synchronized void run(){
while(flag){
try{
wait();
}catch(InterruptedException e){
System.out.println(Thread.currentThread().getName()+"....."+e);
flag=false;
}
System.out.println(Thread.currentThread().getName()+".....++++");
}
}
public void setFlag(){
flag=false;
}
}
public class StopThreadDemo {
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.setDaemon(true);
t2.start();
int num = 1;
for(;;)
{
if(++num==50)
{
// st.setFlag();
t1.interrupt();
// t2.interrupt();
break;
}
System.out.println("main...."+num);
}
System.out.println("over");
}
}
臨時(shí)加入一個(gè)線程運(yùn)算時(shí)可以使用join方法递览。
class Demo implements Runnable{
public void run(){
for(int x=0;x<50;x++){
System.out.println(Thread.currentThread().toString()+"....."+x);
Thread.yield();
}
}
}
public class JoinDemo {
public static void main(String[] args) throws Exception
{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start();
// t2.setPriority(Thread.MAX_PRIORITY);
t1.join();//t1線程要申請(qǐng)加入進(jìn)來叼屠,運(yùn)行瞳腌。臨時(shí)加入一個(gè)線程運(yùn)算時(shí)可以使用join方法绞铃。
for(int x=0; x<50; x++)
{
// System.out.println(Thread.currentThread()+"....."+x);
}
}
}
多線程技術(shù)總結(jié):
|--進(jìn)程:系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
|--線程:cpu調(diào)度和分派的基本單位嫂侍。
線程與進(jìn)程的關(guān)系:
1.一個(gè)線程只能屬于一個(gè)進(jìn)程儿捧,而一個(gè)進(jìn)程可以有多個(gè)線程荚坞,但至少有一個(gè)線程。
2.資源分配給進(jìn)程菲盾,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源颓影。
3.線程在執(zhí)行過程中,需要協(xié)作同步懒鉴。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步诡挂。
4.線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體临谱。
線程與進(jìn)程的區(qū)別:
1.調(diào)度:線程作為調(diào)度和分配的基本單位璃俗,進(jìn)程作為擁有資源的基本單位。
2.并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行悉默,同一個(gè)進(jìn)程的多個(gè)線程之間也可以并發(fā)執(zhí)行城豁。
3.擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源抄课,但可以訪問隸屬于進(jìn)程的資源唱星。
4.系統(tǒng)開銷:在創(chuàng)建或撤銷進(jìn)程的時(shí)候,由于系統(tǒng)都要為之分配和回收資源跟磨,導(dǎo)致系統(tǒng)的明顯大于創(chuàng)建或撤銷線程時(shí)的開銷间聊。但進(jìn)程有獨(dú)立的地址空間,進(jìn)程崩潰后抵拘,在保護(hù)模式下不會(huì)對(duì)其他的進(jìn)程產(chǎn)生影響甸饱,而線程只是一個(gè)進(jìn)程中的不同的執(zhí)行路徑。線程有自己的堆棧和局部變量仑濒,但線程之間沒有單獨(dú)的地址空間叹话,一個(gè)線程死掉等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯墩瞳,但是在進(jìn)程切換時(shí)驼壶,耗費(fèi)的資源較大,效率要差些喉酌。
jvm中的多線程體現(xiàn):
|--主線程热凹,垃圾回收線程,自定義線程泪电。以及他們運(yùn)行的代碼位置般妙。
什么時(shí)候使用多線程,多線程的好處是什么相速?創(chuàng)建線程的目的碟渺?
|--當(dāng)需要多部分代碼同時(shí)執(zhí)行的時(shí)候杰妓,可以使用哀蘑。
創(chuàng)建線程的兩種方式:
1.繼承Thread颂龙;
|--復(fù)寫父類中的方法珊肃;目的:將自定義代碼存儲(chǔ)在run方法中,讓線程運(yùn)行绒极。
|--調(diào)用線程的start方法骏令,該方法有兩個(gè)作用:?jiǎn)?dòng)線程,調(diào)用run方法垄提。
2.實(shí)現(xiàn)Runnable接口
|--覆蓋Runnable接口中的run方法榔袋。
|--通過Thread類建立線程對(duì)象。
|--將Runnable接口的子類對(duì)象作為實(shí)際參數(shù)傳給Thread類的構(gòu)造函數(shù)铡俐。
|--調(diào)用Thread類的start方法開啟線程并調(diào)用Runnable接口子類的run方法摘昌。
#######實(shí)現(xiàn)方式和繼承方式有什么區(qū)別?
1.實(shí)現(xiàn)方式相比繼承方式的好處:避免了單繼承的局限性高蜂。在定義線程時(shí)聪黎,建議使用實(shí)現(xiàn)方式。
2.存放代碼位置不一樣:
|--繼承Thread:線程代碼放在Thread子類的run方法中备恤。
|--實(shí)現(xiàn)Runnable:線程代碼存在接口的子類的run方法中稿饰。
#######實(shí)現(xiàn)Runnable接口的好處:
1.將線程的任務(wù)從線程的子類中分離出來,進(jìn)行了單獨(dú)的封裝露泊。按照面向?qū)ο笏枷雽⑷蝿?wù)封裝成對(duì)象喉镰。
2.避免了java單繼承的局限性。
線程的5種狀態(tài)惭笑。
|--被創(chuàng)建
|--運(yùn)行
|--凍結(jié)
|--臨時(shí)阻塞
|--消亡
線程的安全問題侣姆。★★★★★
|--解決的體現(xiàn):synchronized
|--同步的前提:必須多個(gè)線程使用同一個(gè)鎖沉噩。(加上同步還出現(xiàn)安全問題捺宗,就需要用前提來思考。)
|--同步的兩種表現(xiàn)方法和區(qū)別:
|--同步的好處和弊端:
|--單例的懶漢式川蒙。
|--死鎖蚜厉。
線程間的通信。等待/喚醒機(jī)制畜眨。
|--概念:多個(gè)線程昼牛,不同任務(wù),處理同一資源康聂。
|--等待喚醒機(jī)制贰健。使用了鎖上的 wait notify notifyAll. ★★★★★
|--生產(chǎn)者/消費(fèi)者的問題。并多生產(chǎn)和多消費(fèi)的問題恬汁。 while判斷標(biāo)記伶椿。用notifyAll喚醒對(duì)方。 ★★★★★
|--JDK1.5以后出現(xiàn)了更好的方案,★★★
Lock接口替代了synchronized
Condition接口替代了Object中的監(jiān)視方法悬垃,并將監(jiān)視器方法封裝成了Condition
和以前不同的是游昼,以前一個(gè)鎖上只能有一組監(jiān)視器方法「什裕現(xiàn)在尝蠕,一個(gè)Lock鎖上可以多組監(jiān)視器方法對(duì)象。
可以實(shí)現(xiàn)一組負(fù)責(zé)生產(chǎn)者载庭,一組負(fù)責(zé)消費(fèi)者看彼。
線程常見的一些方法。
|--setDaemon()
|--join();
|--優(yōu)先級(jí)
|--yield();
|--在開發(fā)時(shí)囚聚,可以使用匿名內(nèi)部類來完成局部的路徑開辟靖榕。