?1、開啟一個新線程的方法,歸結起來不外乎有兩種:
4、處理 uncaught exceptions:
當一個線程的run()方法執行完畢或者run()方法執行return語句時,線程正常中止。當run方法拋出一個unchecked異常時(注意:run方法是不能拋出checked異常的),線程也會中止并且打印出異常信息。如果你想捕獲處理該異常,則必須為該線程添加一個uncaught exception handler來執行。例如:
- 繼承類java.lang.Thread ,覆蓋其中的方法 run(); 實例化該子類,例如:public?class?MyThread?extends?Thread?
{
???public?void?run()?
??{
??????//?do?some?work
???}
}
//?code?to?use?MyThread
new?MyThread().start(); - 定義一個實現接口 java.lang.Runnable; 的類,實現該接口的方法run(); 然后將該類的一個實例作為實參傳給Thread的構造方法。例如:public?class?MyThread2?implements?Runnable?
{
???public?void?run()?
??{
??????//?do?some?work
???}
}
//?code?to?use?MyThread2
Thread?t?=?new?Thread(MyThread2);
t.start(); - 無論用哪種方法最終得到的都是一個Thread的object,當調用方法start()時,系統將創建一個新的線程來執行run() 方法,這個新的線程將一直運行知道run方法退出。在新線程開始運行的同時,原來的線程也將繼續執行start()之后的代碼。
- NEW : 線程已經被創建,但是start()方法還沒被調用,所有的線程都是從這個狀態開始的
- RUNABLE : 該線程已經在JVM上執行了,但可能還在等待操作系統種的其他資源,也就是說要么現在就在運行,要么只要操作系統調度到該線程時立即就可以執行。
- BLOCKED : 線程并沒有運行因為它必須等待直到獲得一個鎖以便進入一個synchronized的方法或者塊。
- WAITING : 線程并沒有運行因為它已經調用了方法 Object.wait()或者 Thread.join( ).
- TIMED_WAITING :線程并沒有運行因為它已經調用了Thread.sleep()或者調用了使用timeout值的Object.wait()或者 Thread.join( ).
- TERMINATED : 線程已經完成執行任務,即run()方法要么正常退出,要么拋出一個異常。
public?final?static?int?MIN_PRIORITY?=?1;?//最小優先級
public?final?static?int?NORM_PRIORITY?=?5;?//默認的優先級
public?final?static?int?MAX_PRIORITY?=?10;?//最大優先級
一個線程的優先級可以是1到10中任何一個整數(包括1和10).方法 void setPriority(int newPriority) 可以用來設置線程有限級。關于優先級需要注意的是,調度器總是選擇優先級最高的線程來執行,但是java的線程優先級是和操作系統相關的,例如windows XP系統有7個優先級,java中的某些優先級會對應到xp的7個優先級中去。但是SUN 的linux版本的JVM上所有線程的優先級都是NORM_PRIORITY。在使用優先級的同時也要避免餓死的情況出現。public?final?static?int?NORM_PRIORITY?=?5;?//默認的優先級
public?final?static?int?MAX_PRIORITY?=?10;?//最大優先級
4、處理 uncaught exceptions:
當一個線程的run()方法執行完畢或者run()方法執行return語句時,線程正常中止。當run方法拋出一個unchecked異常時(注意:run方法是不能拋出checked異常的),線程也會中止并且打印出異常信息。如果你想捕獲處理該異常,則必須為該線程添加一個uncaught exception handler來執行。例如:
package?uncaughtexception;
public?class?MyThread?implements?Runnable
{
????@Override
????public?void?run()
????{
????????throw?new?UnsupportedOperationException();
????}
}
public?class?MyThread?implements?Runnable
{
????@Override
????public?void?run()
????{
????????throw?new?UnsupportedOperationException();
????}
}
package?uncaughtexception;
public?class?TestMyThread
{
????public?static?void?main(String?[]?args)
????{
????????Thread?aThread?=?new?Thread(new?MyThread());
????????
????????aThread.setUncaughtExceptionHandler(new?Thread.UncaughtExceptionHandler()
????????{
????????????@Override
????????????public?void?uncaughtException(Thread?t,?Throwable?e)
????????????{
????????????????System.out.println("Hello");
????????????}
????????});
????????
????????aThread.start();
????}
}
運行結果: Hellopublic?class?TestMyThread
{
????public?static?void?main(String?[]?args)
????{
????????Thread?aThread?=?new?Thread(new?MyThread());
????????
????????aThread.setUncaughtExceptionHandler(new?Thread.UncaughtExceptionHandler()
????????{
????????????@Override
????????????public?void?uncaughtException(Thread?t,?Throwable?e)
????????????{
????????????????System.out.println("Hello");
????????????}
????????});
????????
????????aThread.start();
????}
}