多線程詳細筆記(含代碼)_第1頁
多線程詳細筆記(含代碼)_第2頁
多線程詳細筆記(含代碼)_第3頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、java 知識點總結(jié)多進程1.基本概念:程序、進程、線程程序 (program) :一組指令的集合,一段靜態(tài)代碼。(完成特定任務(wù)的代碼,由某種語言編 寫)進程 (process) :是一 個程序的執(zhí)行過程(即 正在運行 的程序)。是個動態(tài)過程:有他自身 的產(chǎn)生、存在和消亡的過程。PS:例子:如運行中的QQ,運行中的MP3播放器。程序和進程區(qū)別:程序時靜態(tài)的,進程是動態(tài)的。線程(thread):進程可細分為線程,是一個程序內(nèi)部的一條執(zhí)行路徑PS:若一個程序可同一時間執(zhí)行多個線程,就是支持多線程的何時需要多線程 :1程序需要同時執(zhí)行多個任務(wù);2程序需要實現(xiàn)一些需要等待的任務(wù)的時候(如用戶輸入、文件

2、讀 寫操作、網(wǎng)絡(luò)操作、搜索等。);3需要一些后臺運行的程序時守護線程。(如垃圾回收線程)2.多線程的創(chuàng)建和使用(1)線程的創(chuàng)建(2種方法)1第一種創(chuàng)建:繼承于 類(無需插包)例子: / 1.創(chuàng)建一個繼承于Thread的類class SubThread exte nds Threadpublic void run() / 2.重寫Thread類的run ()方法,方法內(nèi)實現(xiàn)子線程內(nèi)要完成的功能for(int i=0;i<100;i+)public class TestThreadpublic static void main( Stri ng args)SubThread st = new

3、 SubThread(); /3.創(chuàng)建一個子類對象st.start(); / 4.調(diào)用線程的start()方法(兩個作用:啟用此線程,調(diào)用相應(yīng)的run方法)注意:Thread類常用的方法及作用-1 start()方法。啟動線程并執(zhí)行相應(yīng)的run方法2 run() 方法。子線程要執(zhí)行的代碼放到 run() 方法中3 currentThread() 。靜態(tài)的,調(diào)用當(dāng)前線程(相當(dāng)于一個當(dāng)前線 程的對象,都是在自己的線程里才用的)。(讀音:克(餓) 潤特)4 getName() 方法。獲得此線程的名字5 setName() 方法。設(shè)置此線程的名字6 yield()方法。CPU暫時釋放該線程的執(zhí)行權(quán)(也

4、可能在下一次搶 到執(zhí)行權(quán))(讀音:億奧的) 7join() 方法(該方法有異常,需要 try catch ,使用的時候都是調(diào) 用其他線程,stl.join()。在A線程調(diào)用B線程的join方法時,A線停止運 行,直至 B 線程執(zhí)行結(jié)束, A 線程再接著 join 之后的方法繼續(xù)執(zhí)行。 8 isAlive() 方法。判斷當(dāng)前線程是否還存活(返回時布爾值)。 9 sleep(long a) 方法(需要拋 try catch 異常)。顯示讓當(dāng)前線程 睡眠 a 毫秒。 10 線程通信: wait() 、notify() 、 notifyAll()線程優(yōu)先級的方法(優(yōu)先級大的線程搶到 CPU 的概率大點

5、) 1 1 setPriority() :設(shè)置線程優(yōu)先級(最小 1,最大 10(也可表示 Thread.MAX_PRIORITY ),正常 5) (讀音:破 ruai 歐瑞踢 ) 12 getPriority() :返回線程優(yōu)先值例子例子 1:currentThread() 、getName() 、setName()public voia run()for(int i=0;i<10;i+)+ ” :" +i);/調(diào)用當(dāng)前線程的名字,當(dāng)前線程是st1public class TestThread1public static void main( Str in g args)/設(shè)置

6、線程st1的名字/開始st1線程“主線程” );/設(shè)置當(dāng)前線程的名字SubThread1 st1= new SubTread1(); st1.setName("子線程 1 ” ); st1.start();Thread.curre ntThread().setName(當(dāng)前線程時主線程)for(int i=0;i<10;i+)” :" +i);# 例子 2:yield()public voia run()for(int i=0;i<10;i+)” :" +i);public class TestThread1public static void mai

7、n( Str in g args)SubThread1 st1= new SubTread1();st1.setName("子線程 1 ” );st1.start();Thread.curre ntThread().setName("主線程");for(int i=0;i<10;i+)” :" +i);if(i%10=0)Thread.crrentThread().yield(); / 當(dāng) i 是 10 的倍數(shù)的時候,主線程暫時釋放CPU的執(zhí)行權(quán)#例子3:join(),該方法有異常,需要try catchpublic voia run()for(i

8、nt i=0;i<10;i+)” :" +i);public class TestThread1public static void main( Str in g args)SubThread1 st1= new SubTread1();st1.setName("子線程 1 ” );st1.start();Thread.curre ntThread().setName("主線程");for(int i=0;i<10;i+)” :" +i);程st1,當(dāng)st1運行結(jié)束,繼續(xù)運行主if(i=20)/伙當(dāng)i等于20的時候,當(dāng)前線線程*/t

9、rystl.joi n();catch(I nterrupterExcepti on e)e.pri ntStackTrace();程(主線程)停止運行,并運行線# 例子 4:isAlive()public voia run()for(int i=0;i<10;i+)” :" +i);public class TestThread1public static void main( Str in g args)SubThread1 st1= new SubTread1();st1.setName("子線程 1 ” );st1.start();Thread.curre n

10、tThread().setName("主線程");for(int i=0;i<10;i+)” :" +i);if(i=20)/伙當(dāng)i等于20的時候,當(dāng)前線程(主線程)停止運行,并運行線程st1,當(dāng)st1運行結(jié)束,繼續(xù)運行主 線程*/trystl.joi n();catch(I nterrupterExcpti on e)e.pri ntstackTrace();判斷線程st1是否還存活(當(dāng)前結(jié)果是否);# 例子 5: sleep(long a),需要拋 try catch 異常public voia run()for(int i=0;i<10;i+)”

11、 :" +i);tryThread.sleep(1000); /當(dāng)線程沒執(zhí)行一次 for循環(huán)睡眠1000毫秒catch(I nterruptedExcepti on e) e.pri ntStackTrace();public class TestThread1public static void main( Str in g args)SubThread1 st1= new SubTread1(); st1.setName(“線程 1 ” );st2.setName(“線程 2” );st1.start();st2.start();#例子6 :設(shè)置優(yōu)先級class SubThrea

12、dl exte nds Thread public voia run()for(int i=0;i<10;i+)” :" +i); /調(diào)用當(dāng)前線程的名字,當(dāng)前線程是st1public class TestThread1public static void main( Str in g args)SubThread1 st1= new SubTread1();st1.setPriority(Thread.MAX_PRIORITY);/設(shè)置線程 st1 的優(yōu)先級為最大,即10st1.setName("子線程 1 ” );st1.start();Thread.curre n

13、tThread().setName("主線程");for(int i=0;i<10;i+)” :" +i);2 第二種創(chuàng)建:實現(xiàn) Runnable 接口public void run()/ 2.實現(xiàn)接口的抽象方法 run方法/子線程執(zhí)行的代碼for(int i=1;iv=100;i+)” :" +i);public class TestThread2public static void main( Str in g args)Thread2 th = new Thread2();/ 3.創(chuàng)建一個 Runnable 接口的實現(xiàn)類的對象Thread t

14、hreadl = new Thread(th, "線程 T );/ 伙 4.創(chuàng)建一個 Thread伙/類的對象,并將Runnable實現(xiàn)類的對象加入到構(gòu)造器中,Thread thread2 =:new Thread( th,”線程2”);/啟動線程;過程:執(zhí)行Thread對象生成時構(gòu)造器形參的對象的run方法Thread thread3 =:new Thread( th,”線程3”);thread1.start();/ 5.調(diào)用Thread的start方法,啟動線此時創(chuàng)建的Thread對象即為一個線程程thread2.start();thread3.start(); (2)線程創(chuàng)建方

15、法之繼成和實現(xiàn)的區(qū)別1 聯(lián)系:public class Thread implements Runnable2 哪種方式好?為什么實現(xiàn)優(yōu)于繼承原因: 1.避免了 java 單繼承的局限性2.如果多線程操作同一份資源(不過可能存在一些線程安全問題),更適合使 用實現(xiàn)的方式3.線程安全問題(1)存在的原因由于一個線程在操作共享數(shù)據(jù)的過程中,未完畢的情況下,另外的線程也參與進來, 導(dǎo)致共享數(shù)據(jù)存在了安全問題2)如何解決:1解決原理:必須讓一個線程操作完畢共享數(shù)據(jù)后,其他線程才有機會操作共享數(shù)據(jù)2 java 中解決線程安全的方式:線程同步機制。(以下兩種方法解決)1方法一:同步代碼塊1語法格式:syn

16、 chro ni zed (同步監(jiān)視器)(讀音:si ng克瑞耐zed)/ 需要被同步的代碼(即為操作共享數(shù)據(jù)的代碼 , 這里需要特 別注意)2使用場景和鎖的使用:A1.共享數(shù)據(jù)多線程共同操作一個數(shù)據(jù)(變量)八2.同步監(jiān)視器(即鎖):由任意一個類的對象來充當(dāng)(不過在所有線 程中,本對象必須只能有一個),哪個線程獲得此監(jiān)視器,誰就執(zhí)行大括號里被同步的代 碼。俗稱:鎖。要求所有線程必須使用同一把鎖。(例子如下)運行結(jié)果如下:/System out .prin tln( Thread. cur rentThread(). getNameC)+,f: H+ticket-ArrayListl .java

17、 J HashSetDemo.jav 丿 TreeSetDemo.jav TreeSetPeopleDe 7 package com.ThreadReview;class SubTest2 implements Runnable int ticket = 10;public void run()while(true)synchronizedCthis) iffticket >= 0)try Thread.sZeep(500); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace

18、C);System, out. printlnf11 票數(shù)還?!?": M+ticket-);Ipublic class TreodTest2ofSyschorized public static void main(String口 args) SubTest2 sb = new SubTest2();Thread tl new Thread(sb一號窗口正在售票”); Thread t2 = new Thread(sb,“二號窗口正在售票”); Thread t3 = new Thread(sb,"三號窗口正在售票”); tl.start();t2.start();t3.start();Problems “ JavadocDeclarationTreadTest2ofSyschorized Java Application /衆(zhòng)數(shù)還剩10票數(shù)還剩g票數(shù)還剩8票數(shù)還剩7來數(shù)還剩6票數(shù)還剩5票數(shù)還剩4票數(shù)還剩

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論