是程序中執行的一個線程,java虛擬機容許應用程序中多個線程同時執行。java
每一個線程都有一個優先級,高優先級的線程比低優先級的線程優先執行,每一個線程均可能也可能不會被標記爲守護進程。當正在運行的代碼建立了一個新的Thread對象的時候,這個新的Thread的初始優先級等於建立它的線程的優先級。當建立它的線程是守護線程的時候,那麼它也是守護線程。安全
當java虛擬機啓動時,一般有一個非守護線程(main方法),java虛擬機繼續執行線程直到如下任何一種狀況發生:測試
1.Runtime類的exit方法被調用,而且是安全的this
2.全部的非守護線程都死亡了,從被調用的run方法返回或者fun方法拋出異常線程
建立一個新的可執行的線程有兩種方法,debug
第一種方法,建立一個類繼承Thread並重寫Thread的run方法。例如對象
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
下面的代碼能夠建立一個線程並啓動繼承
PrimeThread p = new PrimeThread(143); p.start();
第二種方法,建立一個類,實現Runable接口並實現Run方法接口
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
下面的代碼能夠建立一個線程並啓動進程
PrimeRun p = new PrimeRun(143); new Thread(p).start();
每一個線程都有一個名稱,多個線程名字也可能相同, 若是在建立線程時未指定名稱,則會爲其生成一個新名稱
注意:兩種建立線程的方法,啓動的時候代碼不同!
看類中的幾個方法
yield
public static native void yield();
當前線程願意讓出CPU的提示(給調度器),可是調度器能夠忽略這個提示。這個方法不多用,只是在debug或者測試中可能有用,能夠復現bug
sleep
public static native void sleep(long millis) throws InterruptedException;
使當前正在執行的線程停留(暫停執行)指定的毫秒數,這取決於系統定時器和調度程序的精度和準確性
yield和sleep都不釋放鎖,yield是退讓(退讓只是退讓同優先級的,低優先級的仍是不能執行),還醒着呢,因此隨時能夠再次運行,sleep是睡覺,讓低優先級的線程有了執行的機會
再看wait方法,它是Object對象的方法,並非Thread類的方法
public final native void wait(long timeout) throws InterruptedException;
使當前線程等待,直到另外一個線程調用notify()或者notifyAll()方法,或者指定的時間已過。notify和notifyAll都是Object類的方法。這個方法會使當前線程把本身放進這個對象的等待集中,並釋放這個對象的鎖和同步