线程的构造和运行
① 用Thread類構(gòu)造線程對(duì)象(繼承Thread類來創(chuàng)建并啟動(dòng)多線程)
package cn.sxt.thread;/*** 創(chuàng)建線程方式一:* 1、創(chuàng)建:繼承Thread+重寫run* 2、啟動(dòng):創(chuàng)建子類對(duì)象+start* @author 1979**/public class StartThread extends Thread{/*** 線程入口點(diǎn)*/@Overridepublic void run() {for(int i=0;i<20;i++) {System.out.println("一邊聽歌");}}public static void main(String[] args) {/* 如果放在這里,那么要先敲完代碼再聽歌,for循環(huán)結(jié)束后才啟動(dòng)線程* for(int i=0;i<20;i++) {* System.out.println("一邊coding");* }*///創(chuàng)建子類對(duì)象StartThread st = new StartThread();//啟動(dòng)st.start();//不保證立即運(yùn)行 由cpu調(diào)用//st.run();//普通方法調(diào)用,只能聽完歌再敲代碼for(int i=0;i<20;i++) {System.out.println("一邊coding");}} }【運(yùn)行結(jié)果】
一邊coding 一邊coding ... 一邊聽歌 一邊聽歌 ... 一邊coding 一邊coding【缺點(diǎn)】:由于java采用單繼承機(jī)制,若為實(shí)現(xiàn)多線程而繼承了Thread,將無法再繼承其他類,是非常不明智的做法。
② 用Runnable輔助構(gòu)造線程(實(shí)現(xiàn)Runnable接口創(chuàng)建線程類)
package cn.sxt.thread;/**** 創(chuàng)建線程方式二* 1、創(chuàng)建:實(shí)現(xiàn)Runnable+重寫run* 2、啟動(dòng):創(chuàng)建實(shí)現(xiàn)類對(duì)象+Thread對(duì)象+start* * 推薦:避免單繼承的局限性,優(yōu)先使用接口* 方便共享資源* @author 1979**/ public class StartRun implements Runnable{/*** 線程入口點(diǎn)*/@Overridepublic void run() {for(int i=0;i<20;i++) {System.out.println("一邊聽歌");}}public static void main(String[] args) {/* 如果放在這里,那么要先敲完代碼再聽歌,for循環(huán)結(jié)束后才啟動(dòng)線程* for(int i=0;i<20;i++) {* System.out.println("一邊coding");* }*///創(chuàng)建實(shí)現(xiàn)類對(duì)象StartRun sr = new StartRun();//創(chuàng)建代理類對(duì)象Thread t = new Thread(sr);//啟動(dòng)t.start();//不保證立即運(yùn)行 由cpu調(diào)用//st.run();//普通方法調(diào)用,只能聽完歌再敲代碼for(int i=0;i<20;i++) {System.out.println("一邊coding");}} }【運(yùn)行結(jié)果】
一邊coding 一邊coding ... 一邊聽歌 一邊聽歌 ... 一邊coding 一邊coding package liti_07;/*本例展現(xiàn)這樣一種方式:利用Runnable接口直接構(gòu)造線程并運(yùn)行*有如下關(guān)鍵點(diǎn):*1、希望該類中創(chuàng)建線程對(duì)象,就必須有線程成員,即私有變量t;*2、在構(gòu)造函數(shù)中構(gòu)造t引用的線程對(duì)象,注意把自己作為參數(shù)傳給t;*3、還需要啟動(dòng)線程。由于t長設(shè)為私有,故不能直接t.start(),* 需要設(shè)置其他方法,如本例另提供一個(gè)公共的start()方法。**/ public class Ch_7_3 implements Runnable{public static void main (String[] args) {System.out.print("Main 開始");Ch_7_3 m1=new Ch_7_3(1,"奇數(shù)線程"); //注意,m1依舊不是線程對(duì)象Ch_7_3 m2=new Ch_7_3(2,"偶數(shù)線程");m1.start(); //注意,調(diào)用的是類R自己定義的start()m2.start();System.out.print("當(dāng)前共有"+ Thread.activeCount()+"個(gè)線程");System.out.print("Main 結(jié)束");}private int d;private Thread t; //-----新增成員public void start(){ t.start(); } //-----關(guān)鍵點(diǎn)2 public Ch_7_3(int x, String s){d=x;//t=new Thread(this); t.setName(s); //----關(guān)鍵點(diǎn)1t=new Thread(this,s);}public void run(){for(int i=d; i<50;i=i+2)System.out.print(" "+i);//Thread t=Thread.currentThread(); //---此句不再需要System.out.print(t.getName()+"結(jié)束!");} }線程的一些常用方法
1、currentThread()
返回對(duì)當(dāng)前正在執(zhí)行的線程對(duì)象的引用。
2、getId()
返回此線程的標(biāo)識(shí)符
3、getName()
返回此線程的名稱
4、getPriority()
返回此線程的優(yōu)先級(jí)
5、isAlive()
測試這個(gè)線程是否還處于活動(dòng)狀態(tài)。
什么是活動(dòng)狀態(tài)呢?
活動(dòng)狀態(tài)就是線程已經(jīng)啟動(dòng)且尚未終止。線程處于正在運(yùn)行或準(zhǔn)備運(yùn)行的狀態(tài)。
6、sleep(long millis)
使當(dāng)前正在執(zhí)行的線程以指定的毫秒數(shù)“休眠”(暫時(shí)停止執(zhí)行),具體取決于系統(tǒng)定時(shí)器和調(diào)度程序的精度和準(zhǔn)確性。
7、interrupt()
中斷這個(gè)線程。
8、interrupted() 和isInterrupted()
interrupted():測試當(dāng)前線程是否已經(jīng)是中斷狀態(tài),執(zhí)行后具有將狀態(tài)標(biāo)志清除為false的功能
isInterrupted(): 測試線程Thread對(duì)相關(guān)是否已經(jīng)是中斷狀態(tài),但不清楚狀態(tài)標(biāo)志
9、 setName(String name)
將此線程的名稱更改為等于參數(shù) name 。
10、isDaemon()
測試這個(gè)線程是否是守護(hù)線程。
11、setDaemon(boolean on)
將此線程標(biāo)記為 daemon線程或用戶線程。
12、join()
在很多情況下,主線程生成并起動(dòng)了子線程,如果子線程里要進(jìn)行大量的耗時(shí)的運(yùn)算,主線程往往將于子線程之前結(jié)束,但是如果主線程處理完其他的事務(wù)后,需要用到子線程的處理結(jié)果,也就是主線程需要等待子線程執(zhí)行完成之后再結(jié)束,這個(gè)時(shí)候就要用到j(luò)oin()方法了。
join()的作用是:“等待該線程終止”,這里需要理解的就是該線程是指的主線程等待子線程的終止。也就是在子線程調(diào)用了join()方法后面的代碼,只有等到子線程結(jié)束了才能執(zhí)行
13、yield()
yield()方法的作用是放棄當(dāng)前的CPU資源,將它讓給其他的任務(wù)去占用CPU時(shí)間。注意:放棄的時(shí)間不確定,可能一會(huì)就會(huì)重新獲得CPU時(shí)間片。
14、setPriority(int newPriority)
更改此線程的優(yōu)先級(jí)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 数据结构与算法——二分查找与二叉排序树
- 下一篇: linux的基础知识——正则表达式