|
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)靜態(tài)方法強制當前正在執(zhí)行的線程休眠(暫停執(zhí)行),以“減慢線程”。
當線程睡眠時,它睡在某個地方,在蘇醒之前不會返回到可運行狀態(tài)。
當睡眠時間到期,則返回到可運行狀態(tài)。
線程睡眠的原因:線程執(zhí)行太快,或者需要強制進入下一輪,因為Java規(guī)范不保證合理的輪換。
睡眠的實現(xiàn):調(diào)用靜態(tài)方法。
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
睡眠的位置:為了讓其他線程有機會執(zhí)行,可以將Thread.sleep()的調(diào)用放線程run()之內(nèi)。這樣才能保證該線程執(zhí)行過程中會睡眠。
- public class TestSleep {
-
- public static void main(String[] args) {
-
- MyThread2 t1 = new MyThread2("TestSleep");
- t1.start();
-
- for(int i=0 ; i <10; i++)
- System.out.println("I am Main Thread");
- }
- }
-
- class MyThread2 extends Thread {
-
- MyThread2(String s) {
- super(s);
- }
-
- public void run() {
- for(int i = 1; i <= 10; i++) {
- System.out.println("I am "+getName());
- try {
- sleep(1000); //暫停,每一秒輸出一次
- }catch (InterruptedException e) {
- return;
- }
- }
- }
- }
注意:
1、線程睡眠是幫助所有線程獲得運行機會的最好方法。
2、線程睡眠到期自動蘇醒,并返回到可運行狀態(tài),不是運行狀態(tài)。sleep()中指定的時間是線程不會運行的最短時間。因此,sleep()方法不能保證該線程睡眠到期后就開始執(zhí)行。
3、sleep()是靜態(tài)方法,只能控制當前正在運行的線程。
實例二:一個計數(shù)器,計數(shù)到100,在每個數(shù)字之間暫停1秒,每隔10個數(shù)字輸出一個字符串
- public class MyThread extends Thread {
- public void run() {
- for (int i = 0; i < 100; i++) {
- if ((i) % 10 == 0) {
- System.out.println("-------" + i);
- }
- System.out.print(i);
- try {
- Thread.sleep(1000);
- System.out.print(" 線程睡眠1秒!\n");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) {
- new MyThread().start();
- }
- }
|