1. 程式人生 > >java自定義執行緒(兩種方法)

java自定義執行緒(兩種方法)

知識點總結
java中的執行緒模型:一個虛擬cpu,多個執行緒
static start方法:啟動執行緒而非執行執行緒(僅僅告訴虛擬機器,該執行緒已經準備完畢,cup決定執行緒執行的時刻)
static sleep方法:在制定的毫秒數內讓當前正在執行的執行緒休眠
static yield方法:主動讓出cpu,重新排隊,正在執行的執行緒將cpu讓給其他具有相同優先順序的執行緒,自己進入就緒狀態重新排隊
finnal join方法:等待該執行緒結束

繼承一個Thread類

private class MyThread extends Thread
{
/** * <p>覆蓋的run函式</p> * @see java.lang.Thread#run() * 實現run方法,安放程式碼邏輯 */ @Override public void run() { while(true){ lt=LocalTime.now(); lab_time.setText(lt.format(formatter)); try
{ // milli second 毫秒 1000 milli=1s sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }

缺點:無法再繼承其他的類,邏輯上既有cpu,又有執行緒,比較混亂

實現runnable介面

private class MyThread2 implements Runnable{
        /**
         * <p>覆蓋的run函式</p>
         * @see java.lang.Thread#run()
         * 實現run方法,安放程式碼邏輯
         */
        @Override
        public void run() {
            while(true){
                lt=LocalTime.now();
                lab_time.setText(lt.format(formatter));
                try {
//                  靜態方法,在某些地方可能受限
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }
    }

呼叫方法

自定義執行緒的呼叫,start():啟動執行緒而非執行執行緒(僅僅告訴虛擬機器,該執行緒已經準備完畢,cup決定執行緒執行的時刻)

new MyThread().start();

交替呼叫兩個執行緒

自定義執行緒如下:

private class MyThread_run implements Runnable{
        String str;
        public MyThread_run(String str) {
            this.str=str;
        }
        /**
         * <p>覆蓋的run函式</p>
         * @see java.lang.Thread#run()
         * 實現run方法,安放程式碼邏輯
         */
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread()+":"+str+"  數字:"+i);

                try {
//                  靜態方法,在某些地方可能受限
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }


        }
    }

呼叫執行緒,執行緒交替執行,sleep時間越長越容易看出效果

Thread t1=new Thread(new MyThread_run("t1"));
        Thread t2=new Thread(new MyThread_run("t2"));
        t1.start();
        try {
            t1.sleep(1000);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        t2.start();

輪流呼叫兩個執行緒

class TwoThread3 extends Thread {
    static StringBuffer obj=new StringBuffer();
    boolean f=true;
    int mark=0;
    String num;

    public TwoThread3(String num) {
        this.num=num;
    }

    /**
     * <p>
     * 覆蓋的run函式
     * </p>
     * 
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        synchronized (obj) {
            if (num.equals("2")&&mark==0) {
                mark=1;
                obj.notify();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 10; i++) {
                obj.append(num);
                System.out.print(num);
                obj.notify();
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }
        save_as_file();
    }
    // 將執行結果寫入檔案
    public void save_as_file() {
        File file = new File("Result.txt");
        try {
            FileWriter fr = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fr);
            bw.write(obj.toString());
            bw.close();
            fr.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class TwoThread {

    public static void main(String[] args) {
        // 如果執行緒的物件不一致,則釋放出來的鎖不是另一個執行緒希望的鎖,為死鎖狀態
        String s = "";
        new TwoThread3("2").start();
        new TwoThread3("1").start();


    }

}

執行效果:

12121212121212121212

寫入檔案的內容:

雙執行緒輪流呼叫