1. 程式人生 > >執行緒的生命週期的方法

執行緒的生命週期的方法

執行緒的生命週期:

指執行緒從建立到啟動,直至執行結束,可以通過呼叫Thread的相關方法影響執行緒的執行狀態

執行緒的執行狀態::

新建、可執行、執行、阻塞、死亡

yield():若當前執行緒呼叫該方法,則由執行狀態變成可執行狀態

package org.jsoft.Thread;

public class YieldThreadTest extends Thread{
    
    public static void main(String[] args) {
        Thread t1 = new YieldThreadTest("執行緒-1");
        Thread t2 = new YieldThreadTest("執行緒-2");
        t1.start();
        t2.start();
    }
    
    public YieldThreadTest(String name){
        super(name);//這的name第什麼,threadName就是什麼
    }
    
    

@Override
    public void run() {
        super.run();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i%10 == 0){
                yield();//讓當前程序重新進入到可執行狀態,也就是讓出了CPU的控制權,誰搶到誰就執行

            }
        }
    }
}

進入阻塞狀態下的三種情況:

1.呼叫sleep方法(使當前執行緒休眠一段時間,以毫秒為單位)

2.呼叫join方法(處在執行狀態的執行緒如果呼叫了其他執行緒的join方法,將被掛起進入阻塞狀態,目標執行緒執行完畢後才會接觸阻塞,回到可執行狀態)

3.執行I/0操作-

join()例子:

package org.jsoft.Thread;

public class JoinThreadTest extends Thread{
    
    public static void main(String[] args) {
        
        Thread t1 = new JoinThreadTest();
        t1.start();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i == 10){
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    @Override
    public void run() {
        super.run();
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
        }
    }
}
interrupt():可以解除執行緒的阻塞狀態

package org.jsoft.Thread;

public class InterruptThreadTest extends Thread{
    
    public static void main(String[] args) {
        InterruptThreadTest t1 = new InterruptThreadTest();
        t1.start();
        //呼叫阻塞執行緒的interrupt方法(執行緒睡眠時,呼叫該執行緒的interrupt方法會丟擲interrruptedException)
        t1.interrupt();
    }
    
    @Override
    public void run() {
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
            if(i == 10){
                try {
                    Thread.sleep(1000000);//子類不能丟擲比父類更大的異常,所以只能try catch
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
}
isAlive()判斷執行緒是否活著(即非死亡狀態):

package org.jsoft.Thread;

public class IsAliveThreadTest extends Thread{
    
    public static void main(String[] args) {
        
        IsAliveThreadTest thread = new IsAliveThreadTest();
        System.out.println(thread.isAlive());//false,因為執行緒還沒有執行
        thread.start();//進行可執行狀態,搶佔CPU的資源
        System.out.println(thread.isAlive());//true,因為執行緒執行了
        //在當前的main執行緒中呼叫thread執行緒的join()來讓thread這個執行緒執行完畢,掛起當前的main執行緒
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread.isAlive());//false,因為執行緒執行完畢
        thread.start();//執行緒執行完畢後在開啟則會報錯:java.lang.IllegalThreadStateException
    }
    
    @Override
    public void run() {
        for(int i = 0; i < 100; i++){
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + ":" + i);
        }
    }
}