1、繼承thread類,重寫run方法,直接調(diào)用.start()方法啟動(dòng)
public class Mythread extends Thread{
? ? public void run(){
? ? }
}
public classMain{
? ? public static void main(String[] args){
? ? ? ?new Mythread().start();
? ? }
}
2、實(shí)現(xiàn)runnable接口,重寫run方法,new對(duì)象放到thread類中,得到thread對(duì)象,再調(diào)用.start()啟動(dòng)
public class Mythread implement runnable{
? ?public void run(){
? ?}
}
public class Main{
? ? ?public static void main(String[] args){
? ? ?Mythread? mythread =new?Mythread ();
? ? Thread thread=new Thread(mythread?);
? ? thread.start();
? ? ?}
}
3、JAVA啟動(dòng)時(shí)候運(yùn)行了多少線程?
至少兩個(gè):主線程(main方法)和GC(垃圾回收機(jī)制)
4、start()和run()的區(qū)別?
Start()是啟動(dòng)線程,使線程處于就緒狀態(tài),供jvm來(lái)調(diào)用執(zhí)行。
run()是運(yùn)行處于就緒狀態(tài)的線程
如果直接調(diào)用run()方法,程序中只有主線程一個(gè)線程。
如果用start()來(lái)調(diào)用,不僅有主線程,還有我們自己要執(zhí)行的線程。
通過(guò)start()方法啟動(dòng)線程的同時(shí)也創(chuàng)建了一個(gè)線程,真正實(shí)現(xiàn)了多線程。此時(shí)start()的這個(gè)線程處于就緒狀態(tài),當(dāng)?shù)玫紺PU的時(shí)間片后就會(huì)執(zhí)行其中的run()方法。
5、sleep()和wait()的區(qū)別:
獲得對(duì)象鎖代表獲得了運(yùn)行所需的資源,進(jìn)入就緒狀態(tài),只要獲得CPU,就可以進(jìn)入運(yùn)行狀態(tài)。
sleep()只是線程在一定時(shí)間內(nèi)休眠,讓出了CPU,但是并沒(méi)有釋放對(duì)象鎖,時(shí)間到了之后獲取到CPU就可以運(yùn)行。
wait()是線程進(jìn)入等待狀態(tài),釋放了所占有的所有資源,包括對(duì)象鎖,必須依靠其他線程調(diào)用notify()或notifyAll()方法才能被喚醒,線程被喚醒后會(huì)進(jìn)入鎖池,等待獲取鎖標(biāo)記。(notify()只是喚醒一個(gè)線程,但我們由不能確定具體喚醒的是哪一個(gè)線程)
wait()?和?notify()?方法這一對(duì)方法卻必須在?synchronized?方法或塊中調(diào)用,因?yàn)橹挥性趕ynchronized方法或塊中當(dāng)前線程才占有鎖,才有鎖可以釋放,否則在運(yùn)行時(shí)會(huì)出現(xiàn)IllegalMonitorStateException異常。
6、線程的狀態(tài):
新建、就緒、運(yùn)行、阻塞(等待阻塞【執(zhí)行wait()方法】、同步阻塞【同步鎖被別的線程占用】,其他阻塞【執(zhí)行sleep()或join()方法】)、掛起【調(diào)用resume()方法】、死亡。

7、常用方法:
currentThread():取得當(dāng)前正在運(yùn)行的線程對(duì)象
.currentThread().getName():獲得當(dāng)前線程名稱
.currentThread().getName():設(shè)置當(dāng)前線程名稱
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 線程的名稱一般在啟動(dòng)線程前設(shè)置: newThread(mt,"線程-A").start() ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果沒(méi)有手動(dòng)設(shè)置,則系統(tǒng)自動(dòng)設(shè)置線程名稱。
.isAlive():判斷線程是否啟動(dòng)
.join():暫停其他線程,強(qiáng)制優(yōu)先執(zhí)行該線程
.sleep(時(shí)間):設(shè)置線程休眠一段時(shí)間,到時(shí)間后自動(dòng)啟動(dòng)
.interrupt():中斷線程執(zhí)行
.setDaemon(true):設(shè)置線程在后臺(tái)執(zhí)行
線程優(yōu)先級(jí)分類:最低,最高,普通
(Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY)
.setPriority():設(shè)置優(yōu)先級(jí)
.getPriority():獲取優(yōu)先級(jí)