1. 程式人生 > >執行緒第四課——執行緒常用方法

執行緒第四課——執行緒常用方法

  這節課我們來講講執行緒常用的方法,還是看API文件加寫程式碼演示:

 

以下是Thread類的常用方法

以下是Object類中和執行緒有關的方法:

 

 

 

 

 

Demo:

public class ThreadMethodTeach {



    public static void main(String[] args) throws InterruptedException {



        /**

         * Thread.getName()方法不允許重寫,因為返回值型別為final

         * 注意:

         *  如果在一個類宣告前加final,則這個類無法被繼承,比如java.lang.String

         *  如果一個方法的返回值型別加上final,則這個方法不可以被重寫

         */



        /**

         * Thread.getName() 獲取執行緒的名稱

         * Thread.getPriority() 獲取執行緒的優先順序

         * Thread.join() 停止運行當前正在執行的執行緒(稱為執行緒1吧),將CPU資源讓給呼叫join()方法的執行緒(稱為執行緒2吧),

         *  待執行緒2執行完進入停止狀態後繼續執行執行緒1

         * Thread.yield() 本執行緒讓出CPU資源,進入就緒狀態

         * Object.wait() 這個wait()方法是讓當前正在執行的執行緒進入等待狀態,且本物件監視這個執行緒

         * Object.notify() 喚醒此物件監視器上等待的單個執行緒,使這個執行緒進入就緒狀態

         * Object.notifyAll() 喚醒所有處於等待狀態的執行緒,使其進入就緒狀態

         * Thread.getState() 獲取執行緒當前的狀態

         */



        /**

         * 說下執行緒的狀態:

         * 1. NEW               新建

         * 2. RUNNABLE          執行

         * 3. BLOCKED           就緒

         * 4. WAITING           等待

         * 5. TIME_WAITING      等待(一定時間後就會自動被喚醒)

         * 6. TERMINATED        停止

         *

         * 可以看到和我們上節課所教的狀態是一一對應的(TIME_WAITING也是等待,只不過是一種特殊的等待)

         */





        //來試試

        MyThread1 myThread1 = new MyThread1("執行緒1");

        MyThread1 myThread2 = new MyThread1("執行緒2");





        //在啟動前讓他們可以獲取對方的狀態

        myThread1.setOtherThread(myThread2);

        myThread2.setOtherThread(myThread1);



        //來看看啟動前的狀態

        System.out.println(myThread1.getName() + "的狀態是" + myThread1.getState());

        System.out.println(myThread2.getName() + "的狀態是" + myThread2.getState());



        myThread1.start();

        myThread2.start();

        //等待狀態下節課講吧。。我再去看看。。

    }









}



class MyThread1 extends  Thread{



    //本屬性決定當前執行緒是否停止執行,當其為false時,停止執行

    //這種停止執行緒執行的方法時jdk推薦的,因為stop()方法過時了

    private boolean flag = true;



    private Thread otherThread = null;



    int i;



    public MyThread1() {

        super();

    }



    public MyThread1(Runnable target) {

        super(target);

    }



    public MyThread1(String name) {

        super(name);

    }



    /**

     * @return 返回該執行緒的Id,執行緒Id是自動生成的,且唯一

     */

    @Override

    public long getId() {

        return super.getId();

    }







    //改下run方法

    @Override

    public void run() {

        while(flag)

        {

            System.out.println("我是" + getName() + ",我的狀態為" + getState());

            System.out.println("另一個執行緒是" + otherThread.getName() + ",他的狀態為" + otherThread.getState());

            i++;

            if (i == 10)

            {

                stopThread();//給個結束條件

            }

            //讓出資源

//            yield();



        }

    }



    public void stopThread()

    {

        flag = false;

    }



    public Thread getOtherThread() {

        return otherThread;

    }



    public void setOtherThread(Thread otherThread) {

        this.otherThread = otherThread;

    }

}