一,休眠線程
public static void sleep(long millis) throws InterruptedException
在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響。該線程不丟失任何監視器的所屬權。
參數:millis - 以毫秒為單位的休眠時間。
拋出:InterruptedException - 如果任何線程中斷了當前線程。當拋出該異常時,當前線程的中斷狀態 被清除。
package com.yy.threadmethod;public class Demo3_Sleep {
/*** *當父親壞了,那么,兒子不能比父親更壞*當父親沒壞,兒子如果有壞的東西,必須自己去處理* * public static void sleep(long millis)* throws InterruptedException在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程序精度和準確性的影響。該線程不丟失任何監視器的所屬權。 ** 參數:millis - 以毫秒為單位的休眠時間。 * 拋出:InterruptedException - 如果任何線程中斷了當前線程。當拋出該異常時,當前線程的中斷狀態 被清除。* * */public static void main(String[] args) throws InterruptedException {demo1(); //創建一條線程,對其進行睡眠,使其每秒打印一次demo2(); //創建兩條線程,分別進行睡眠,讓兩條線程交替輸出}private static void demo2() {new Thread(){ //父類Thread類里面的run方法是沒有throw拋異常的,子類在重寫父類的方法的時候,就不能去拋異常,這里只能抓異常surroundpublic void run(){for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + "......aaaaaa");}}}.start();//開啟一條線程new Thread(){public void run(){for (int i = 0; i < 10; i++) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getName() + "......bbbb");}}}.start();//開啟另一條線程
}private static void demo1() throws InterruptedException {for (int i = 20; i >= 0; i--) {System.out.println("倒計時:" + i + "秒");Thread.sleep(100);}}}
二,守護線程
守護線程:設置一個線程為守護線程,該線程不會單獨執行,當其他的非守護線程都結束后,自動退出,退出的時候會有一定的緩沖時間,不會立馬就結束;
public final void setDaemon(boolean on)
將該線程標記為守護線程或用戶線程。當正在運行的線程都是守護線程時,Java 虛擬機退出。 該方法必須在啟動線程前調用。
參數:on - 如果為 true,則將該線程標記為守護線程。
被標記成守護線程的線程,相當于象棋里的車馬象士,而沒被標記為守護線程的線程,相當與將帥。
package com.yy.threadmethod;public class Demo4_Daemon {
/*** 守護線程* 設置一個線程為守護線程,該線程不會單獨執行,當其他的非守護線程都結束后,自動退出,退出的時候會有一定的緩沖時間,不會立馬就結束* * */public static void main(String[] args) {Thread t1 = new Thread(){ //匿名內部類public void run(){ //重寫run()方法for (int i = 0; i < 2; i++) {System.out.println(getName() + "...wsq" );} }};Thread t2 = new Thread(){public void run(){for (int i = 0; i < 50; i++) {System.out.println(getName() + "...yy" );} }};t2.setDaemon(true); //當傳入true就是意味著設置為守護線程,把t2設置成守護線程,相當于象棋中的車馬象士,去守護t1,ti就相當于是將帥’t1.start();t2.start();}}
三,加入線程
join():當前線程暫停,等待指定的線程執行結束之后,當前線程再繼續
join(int):join()的一個重載方法,可以等待指定的毫秒之后繼續
- public final void join()
throws InterruptedException等待該線程終止。 拋出:
InterruptedException - 如果任何線程中斷了當前線程。當拋出該異常時,當前線程的中斷狀態 被清除。public final void join(long millis,int nanos)
throws InterruptedException等待該線程終止的時間最長為 millis 毫秒 + nanos 納秒。- 參數:
millis - 以毫秒為單位的等待時間。
nanos - 要等待的 0-999999 附加納秒。 - 拋出:
IllegalArgumentException - 如果 millis 值為負,則 nanos 的值不在 0-999999 范圍內。
InterruptedException - 如果任何線程中斷了當前線程。當拋出該異常時,當前線程的中斷狀態 被清除。
package com.yy.threadmethod;public class Demo5_Join {public static void main(String[] args) {final Thread t1 = new Thread(){ //匿名內部類(局部內部類)在使用它所在方法中的局部變量的時候,必須用final修飾public void run(){for (int i = 0; i < 10; i++) {System.out.println(getName() + "..." + "海闊天空");}}};Thread t2 = new Thread(){public void run(){for (int i = 0; i < 10; i++) {if(i == 2){ //當i=2時,也就是t2執行兩次之后,t1線程開始插隊try {
// t1.join(); //這表示t1線程開始插隊,然后,直到t1線程運行完畢后,才輪到t2線程運行t1.join(1); //這表示t1線程插隊,插隊1毫秒之后,兩條線程繼續交替進行,也就是繼續多線程進行} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(getName() + "..." + "光輝歲月");}}};t1.start();t2.start();}}
四,禮讓線程
yield:禮讓線程,讓出CPU
public static void yield() 暫停當前正在執行的線程對象,并執行其他線程。
package com.yy.threadmethod;public class Demo6_Yield {public static void main(String[] args) {new MyThread().start(); //定義一條線程 new MyThread().start(); //定義另一條線程}
}class MyThread extends Thread{public void run(){for (int i = 1; i <= 1000; i++) { if(i % 10 == 0){ //若i是10的倍數Thread.yield(); //讓出CPU,讓另一條線程進行}System.out.println(getName() + "..." + i);}}
}