Java自學-多執行緒(2)
阿新 • • 發佈:2021-08-10
Java自學-多執行緒(2)
1、執行緒停止
package lesson03; /** * Author: Gu Jiakai * Date: 2021/8/10 8:35 * FileName: TestStop * Description: */ //測試stop //1.建議執行緒正常停止--->利用次數,不建議死迴圈。 //2.建議使用標誌位--->設定一個標誌位 //3.不要使用stop或者destroy等過時或者JDK不建議使用的方法 public class TestStop implements Runnable { //1、設定一個標誌位。 private boolean flag=true; @Override public void run() { int i=0; while(flag){ System.out.println("run...Thread"+ i++); } } //2、設定一個公開的方法停止執行緒,轉換標誌位 public void stop(){ this.flag=false; } public static void main(String[] args) { TestStop testStop = new TestStop(); new Thread(testStop).start(); for (int i = 0; i < 1000; i++) { System.out.println("main"+i); if(i==900){ //呼叫stop方法,切換標誌位,讓執行緒停止 testStop.stop(); System.out.println("執行緒該停止了!"); } } } }
2、執行緒休眠_sleep
3、執行緒禮讓_yield
package lesson03; /** * Author: Gu Jiakai * Date: 2021/8/10 9:08 * FileName: TestYield * Description: */ //測試禮讓執行緒 //禮讓不一定成功,看CPU心情 public class TestYield { public static void main(String[] args) { MyYield myYield = new MyYield(); new Thread(myYield,"a").start(); new Thread(myYield,"b").start(); } } class MyYield implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()+"執行緒開始執行!"); Thread.yield();//禮讓 System.out.println(Thread.currentThread().getName()+"執行緒停止執行!"); } }
4、執行緒強制執行_join
package lesson03; /** * Author: Gu Jiakai * Date: 2021/8/10 9:19 * FileName: TestJoin * Description: */ //測試join方法 //想象為插隊 public class TestJoin implements Runnable{ @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("執行緒vip來了"+i); } } public static void main(String[] args) throws InterruptedException { // 啟動我們的執行緒。 TestJoin testJoin = new TestJoin(); Thread thread = new Thread(testJoin); thread.start(); //主執行緒 for (int i = 0; i < 500; i++) { if(i==200){ thread.join(); } System.out.println("main"+i); } } }
5、觀測執行緒狀態
package lesson03;
/**
* Author: Gu Jiakai
* Date: 2021/8/10 9:31
* FileName: TestState
* Description:
*/
//觀察測試執行緒的狀態
public class TestState {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("*********");
});
//觀察狀態
Thread.State state = thread.getState();
System.out.println(state);//NEW
//觀察啟動後
thread.start();
state=thread.getState();
System.out.println(state);//Run
while(state!=Thread.State.TERMINATED){//只要執行緒不終止,就一直輸出狀態
Thread.sleep(100);
state=thread.getState();//更新執行緒狀態
System.out.println(state);//輸出狀態
}
}
}