Java中Thread类的方法简介
1.新建線程
Thread t1 = new Thread(); t1.start();新建線程,應該調用start()方法啟動線程;如果直接調用run()方法,該方法也會執行,但會被當做一個普通的方法,在當前線程中順序執行;而如果使用start()方法,則會創建一個新的線程執行run()方法。
2.線程中斷
public void interrupt(); public boolean isInterrupted(); public static boolean interrupted();三個方法很相似,線程中斷只是通知目標線程有人希望你退出,而并不是使目標線程退出。
第一個方法是通知目標線程中斷,即設置目標線稱的中斷標志位;
第二個方法判斷當前線程是否被中斷,如果被中斷(即中斷標志位被設置),則返回true,否則返回false;
第三個方法判斷當前線程的中斷狀態,并清除該線程的中斷標志位(也就意味著,如果連續調用兩次該方法,并且中間沒有再次設置中斷標志位,第二次會返回false,因為中斷標志位已經被清除)。
sleep()方法會將當前線程休眠若干ms,如果在休眠期間被調用interrupt()方法,則會拋出InterruptedException異常。如下:
public class TestThread implements Runnable{@Overridepublic void run() {while(true) {if(Thread.currentThread().isInterrupted()){ //如果當前線程已經被設置了中斷標志位,則返回trueSystem.out.println("Interrupted");break;}try {Thread.currentThread().sleep(1000);} catch (InterruptedException e) {System.out.println("Interruted when sleep!");Thread.currentThread().interrupt(); //Thread.sleep()方法由于中斷而拋出異常,此時,它會清除中斷標記;}Thread.yield();}}public static void main(String[] args){Thread t1 = new Thread(new TestThread());t1.start();t1.interrupt(); //設置目標線程的中斷標志位,中斷標志位表示當前線程已經被中斷了} }3.等待(wait)和通知(notify)
public final void wait() throws InterruptedException; public final native void notify(); public final native void notifyAll();obj.wait()是設置當前線程在該對象上等待,直到有線程調用obj.notify()方法(或notifyAll()方法)。當調用wait()方法后,該線程會進入一個等待隊列,等待隊列中可能有多個線程,notify()會隨機喚醒其中一個線程,而notifyAll()會喚醒所有線程。
wait()和notify()方法必須在sychronized代碼塊中,調用這些方法時都需要先獲得目標對象的一個監視器,然后調用這些方法時會釋放監視器
與sleep不同的是,sleep()會一直占有所持有的鎖,而wait()會釋放鎖。
4.等待線程(join)和謙讓(yield)
public final void join() throws InterruptedException; public static native void yield();如果一個線程的執行需要另一個線程的參與(比如當前線程執行需要另一個線程執行完畢才能繼續執行),這時候可以調用join()方法。t1.join()方法表示等待線程t1執行完畢之后,當前線程再繼續執行。當然也可以給join()設置時間參數。
注:join()的本質是讓調用線程wait()在當前線程對象實例上,其部分源碼如下:
當線程執行完畢后,它會讓被等待的線程在退出前調用notifyAll()通知所有等待的線程繼續執行。因此不要在Thread對象實例上使用類似wait()或者notify()等方法。
yield()方法是使當前線程讓出CPU,但該線程會再次搶奪CPU。
總結
以上是生活随笔為你收集整理的Java中Thread类的方法简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中 out、ref、params 修
- 下一篇: 动态css语言less,less让css