1. 程式人生 > >java執行緒學習(1)_thinkingInjava第四版

java執行緒學習(1)_thinkingInjava第四版

public class LiftOff implements Runnable {

    protected int countDown = 10 ;
    private static int taskCount = 0 ;
    private final int id = taskCount ++ ;
    public LiftOff() {
        super();
    }

    public LiftOff(int countDown) {
        this.countDown = countDown ;
    }

    public String status() {
        return "#" + this.id + "(" + (countDown > 0 ? countDown : "Liftoff!" ) + ") " ;
    }



    @Override
    public void run() {
        while(this.countDown -- > 0) {
            System.out.println(status());
            //對執行緒排程器的一種建議,表示我已經完成生命週期中最重要的部分了 此時正是切換執行緒的大好時機
            Thread.yield();
        }
    }
    public static void main(String [] args) {
        //此寫法並不會呼叫執行緒
        /*LiftOff off = new LiftOff() ;
        off.run();*/

        //要實現執行緒行為 必須顯示的講一個任務附著到執行緒上
        /*Thread thread = new Thread(new LiftOff()) ;
        thread.start();
        System.out.println("Waiting for LiftOff");*/

        //同時啟動多個執行緒 出現執行緒被換進換出時混在了一起
        /*for(int i = 0 ; i < 5; i ++) {
            Thread thread = new Thread(new LiftOff()) ;
            thread.start();
            System.out.println("Waiting for LiftOff");
        }*/

        //使用1.5之後推出的執行器Executor來啟動執行緒
        //通常會創建於所需數量相同的執行緒
        /*ExecutorService exec = Executors.newCachedThreadPool() ;*/
        //使用有限的執行緒來執行任務
        /*ExecutorService exec = Executors.newFixedThreadPool(5) ;*/
        //就像執行緒為1的newFixedThreadPool 如果提交多個任務那麼這些任務將排隊 所有任務使用相同的執行緒
        //這種方式不需要在共享資源上處理同步
        ExecutorService exec = Executors.newSingleThreadExecutor() ;
        for(int i = 0 ; i < 5; i ++) {
            exec.execute(new LiftOff());
        }
        //並不是表示結束執行器 而是防止新的任務被提交給這個執行器
        // (這個程式將在執行器Executor中的所有任務執行結束後儘快的退出)
        exec.shutdown();
    }
}