天天看點

Thread 線程1.線程的狀态2.常用函數3.線程中斷4.線程相關接口

java的線程是通過java.lang.thread類來實作的。

調用完構造函數後,線程就為建立狀态。 

調用start()方法後,所處的狀态。

正常的運作。

資源等待的狀态。

run()方法執行完畢後,該線程就死掉了。注意不能再次調用此線程的start()方法。

java.lang.thread.thread(runnable target, string name)

建立新線程,并指定線程的名字。

java.lang.thread.thread(threadgroup group, runnable target, string name)

建立新線程,并指定線程的名字和所屬線程組。

void java.lang.thread.start()

讓線程置于就緒狀态,等待作業系統排程。

Thread 線程1.線程的狀态2.常用函數3.線程中斷4.線程相關接口

問:它與run()有什麼差別呢?

答:start()是異步的,會新起一個線程,在新的線程中調用run()方法。直接調用run()就是在目前線程中執行同步的方法。

thread java.lang.thread.currentthread()

傳回目前線程。

string java.lang.thread.getname()

傳回線程名稱。

boolean java.lang.thread.isdaemon()

是否是一個背景線程。

void java.lang.thread.yield()

告訴作業系統此時可以進行線程切換。使用此方法有助于暴露線程不安全問題導緻的異常現象。

java.lang.thread.sleep(long millis, int nanos)

目前線程睡眠(millis 毫秒+nanos納秒)。此方法會被timeunit這個枚舉類型調用,可見:void java.util.concurrent.timeunit.sleep(long timeout)。

void java.lang.thread.join(long millis) 

此函數是同步的,當線程結束或等待達到逾時時間後傳回。

thread 的stop()與destory()方法被廢棄,直接調用會有異常,見下:

是以現在你不能暴力地中斷一個線程,隻能讓線程自己來配合。

void java.lang.thread.interrupt()

thread類有一個布爾字段isinterrupted,用來标記自己是否被中斷。調用此方法會置這個變量為true。如果此線程被join()、wait()、sleep()方法阻塞,那麼調用interrupt()方法時會引起interruptedexception異常。

boolean java.lang.thread.isinterrupted()

傳回上面說的isinterrupted布爾變量。

run()裡面的whilr(true) 被 替代,這樣更優雅。一旦run()函數執行完畢,一個線程也就完成了它的使命。

java.lang.runnable

它是一個接口,有run()方法。

接口定義見下:

想要被作為新線程運作的類需要實作runnable接口,在run()函數中完成待處理的任務。

1.定義類a繼承接口runnable,并實作函數 void run();

2.用a的對象構造thread對象。然後調用start()函數。

注意:start()函數為異步調用,立即傳回啦。

java.lang.callable

它是一個接口,有call()方法,用于具有傳回值的多線程任務。

接口定義見下。

例子:

java.util.concurrent.future<e>

future對象代表着一個異步操作的結果。調用此對象的isdone()方法來查詢任務是否已完成,它是異步的。調用get()方法擷取線程執行結果,它是同步的,在結果準備就緒前一直阻塞。

它的接口定義見下: