天天看點

java線程----體驗了解篇

基于慕課網:深入淺出java多線程

java線程----體驗了解篇

隋唐演義模型:

java線程----體驗了解篇

ArmyRunnable.java代碼:

public class ArmyRunnable implements Runnable {

    //volatile保證了線程可以正确的讀取其他線程寫入的值
    //可參考:可見性 ref JMM, happens-before原則
    volatile boolean keepRunning = true;

    @Override
    public void run(){
        while(keepRunning){
            //發動5連擊
            for (int i=0;i<5;i++){
                System.out.println(Thread.currentThread().getName()+"進攻對方["+i+"]");
                //讓出了處理器時間,下次該誰進攻還不一定呢!(thread.yield()方法------目前運作線程釋放處理器資源)
                Thread.yield();
            }
        }
        //Thread.currentThread()方法 傳回目前運作的線程引用
        System.out.println(Thread.currentThread().getName()+"結束了戰鬥!");
    }
}
           

KeyPersonThread.java代碼:

public class KeyPersonThread extends Thread{

    public void run(){
        System.out.println(Thread.currentThread().getName()+"開始戰鬥了!");

        for (int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+"左擊右殺,攻擊随軍...");
        }
        System.out.println(Thread.currentThread().getName()+"結束了戰鬥!");
    }

}
           

這裡ArmyRunnable實作了Runnable接口,而KeyPersonThread則繼承了Thread類;

這是線程的兩種建立方式;

關于實作Runnable接口和繼承Thread類差別:

參考自:https://blog.csdn.net/u012767369/article/details/54907191

如果一個類繼承Thread,則不适合資源共享。但是如果實作了Runable接口的話,則很容易的實作資源共享。

實作Runnable接口比繼承Thread類所具有的優勢:

1):适合多個相同的程式代碼的線程去處理同一個資源

2):可以避免java中的單繼承的限制

3):增加程式的健壯性,代碼可以被多個線程共享,代碼和資料獨立

Stage.java代碼:

/**
 * 隋唐演義大戲舞台
 */
public class Stage extends Thread{

    public void run(){
        System.out.println("歡迎觀看隋唐演義");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("大幕徐徐拉開");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("話說隋朝末年,随軍與農民起義軍 互相厮殺");

        //new兩個 ArmyRunnable對象
        ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
        ArmyRunnable armyTaskOfRevolt = new ArmyRunnable();

        //使用Runnable接口建立線程
        Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty,"隋軍");
        Thread armyOfRevolt = new Thread(armyTaskOfRevolt,"農民起義軍");

        //啟動線程,兩個軍隊
        armyOfSuiDynasty.start();
        armyOfRevolt.start();

        //舞台線程休眠,大家專心觀看軍隊厮殺
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("正當雙方激戰,半路殺出個程咬金");

        Thread mrCheng = new KeyPersonThread();
        mrCheng.setName("程咬金");

        System.out.println("程咬金的理想就是結束戰争,使百姓安居樂業!");

        //停止軍隊作戰
        //停止線程方法
        armyTaskOfSuiDynasty.keepRunning = false;
        armyTaskOfRevolt.keepRunning = false;

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mrCheng.start();

        //所有線程等待程先生完成曆史任務
        try {
            mrCheng.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("戰争結束,人民安居樂業,程先生實作了積極的人生理想,人民安居樂業");
        System.out.println("謝謝觀看隋唐演義,再見!");

    }

    public static void main(String[] args){
        new  Stage().start();
    }

}

           
java線程----體驗了解篇
java線程----體驗了解篇