1. 程式人生 > 其它 >Java自學-多執行緒(2)

Java自學-多執行緒(2)

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);//輸出狀態
        }

    }
}