在多執行緒操作中,有一些常用的方法可以直接供我們使用,這篇部落格主要總結一下這些基本操作。
1:執行緒的命名與取得
因為多執行緒的執行狀態我們無法確定,所以在對多執行緒的操作必須有乙個明確標識出線程物件的資訊,這個資訊往往通過名稱來描述。在thread類中,提供了一系列的相關方法。
方法名稱
型別描述
1public thread(runnable target, string name);
構造方法
在建立執行緒的同時設定名稱
2public final synchronized void setname(string name);
普通方法
設定執行緒名稱
3public final string getname();
普通方法
取得執行緒名字
如果我們想直接取得執行緒的物件,thread類中也提供了乙個相關方法
/**
* returns a reference to the currently executing thread object.
** @return the currently executing thread.
*/public static native thread currentthread();
currentthread()方法可以返回**段正在被哪個執行緒呼叫的資訊,下面我通過乙個示例進行說明。
我們可以發現,man方法被乙個名為main的執行緒所呼叫。我們現在再驗證一種情況
另外,我們也可以注意到:主方法本來就是乙個執行緒,所有的執行緒都是通過主線程建立並啟動的。
關於執行緒的常用方法,大致可以用一張圖來描述
sleep()方法:
它的作用是在指定的毫秒數內讓當前正在執行的程序"休眠"(暫停執行)。這個正在執行的程序指的是this.currentthread()返回的執行緒物件。但是需要注意的是,sleep方法不會解鎖,所以說如果當前執行緒持有某個物件的鎖,即使呼叫了sleep方法,其他的執行緒也無法訪問這個物件。
public static native void sleep(long millis) throws interruptedexception;
關於這個方法的一些細節,我舉乙個例子來說明下
class my_thread extends thread
@override
public void run() catch (exception e)
system.out.println(thread.currentthread().getname()+" "+i);}}
}public class main
}
來看一下結果
我們可以看出來這三個執行緒是併發執行的,而且,還有一點需要注意,這三個執行緒不是同時休眠的。
還有一種和sleep方法類似的方法
yield():執行緒讓步:該方法會放棄當前的cpu資源,將它讓給其他的任務去占用cpu執行時間,但是yield方法不能控制具體的交出cpu的時間,而且,它只能讓擁有相同優先順序的執行緒有獲取cpu執行時間的機會。
另外,yield方法不會讓執行緒進入阻塞狀態,而是讓執行緒重回就緒狀態,它只需要等待重新獲取cpu執行時間,這一點和sleep方法是有區別的。
class my_thread extends thread
long end_time = system.currenttimemillis();
system.out.println("用時:"+(end_time - begin_tie)+"毫秒");
}}public class main
}
yield方法有乙個弊端:它會導致執行速度變慢,因為它會突然把cpu讓給其他資源,這樣會導致速度變慢。
去掉注釋後:
不去掉注釋:
這就很能說明問題了。
關於多執行緒的操作我分成幾個部分總結,先總結到這裡。
javaSE 多執行緒(守護執行緒)
我們一般使用多執行緒,都是while 的死迴圈,想要結束執行緒,只需退出死迴圈即可 當執行緒中呼叫了sleep 方法或者 wait 方法,當前的執行緒就會進入凍結狀態,這個執行緒就結束不了 呼叫thread 物件的interrupt 方法,可以強制解凍,此時 run 方法中需要捕獲到 interru...
javaSE 多執行緒之執行緒池
1 使用語法 publicstaticvoiduseexecutorservice executorservice shutdown 輸出 pool 1 thread 3 pool 1 thread 2 pool 1 thread 1 pool 1 thread 3 pool 1 thread 2 ...
多執行緒基本操作
1 繼承thread類建立執行緒 2 實現runnable介面建立執行緒 3 使用callable和future建立執行緒 1.實現callable介面,重寫call 方法,建立該實現類的例項 2.使用futuretask類來包裝callable物件,該futuretask物件封裝了callable...