spring基礎-task

首先聲明,此博文和spring沒有太大關係,支持學習spring時學習的,就歸納到這個裏面了

線程的實現方式

Runnable Thread Callable

Runnable Thread區別

1.Runnable 並不是一個線程,只是註明可以調用run()方法進行調用
要變成線程,需要將自身傳入Thread中
2.Runable是一個接口而Thread是一個具體的實現類,因此使用Runnable能夠實現出更加低耦合的程序。
3.Runable裏面的實例變量可以被多個線程共享,而Thread的則是每個線程一份

public class RunnableTest {
    public static void main(String[] args) throws IOException, InterruptedException {
        Runnable runnable= new ImplementsRunnable();
        new Thread(runnable).start();
        new Thread(runnable).start();
        Thread.sleep(1000);
        new ExtendsThread().start();
        new ExtendsThread().start();
    }
}

class ImplementsRunnable implements Runnable{
    private AtomicInteger counter = new AtomicInteger(0);

    public void run() {
        while(true){
            if (counter.get() > 2) break;
            System.out.println("ImplementsRunnable counter: " + counter.incrementAndGet());
        }
    }
}

class ExtendsThread extends Thread{
    private AtomicInteger counter = new AtomicInteger(0);

    public void run() {
        while (true) {
            if (counter.get() > 2) break;
            System.out.println("ExtendsThread counter: " +counter.incrementAndGet());
        }
    }
}
//返回結果
ImplementsRunnable counter: 1
ImplementsRunnable counter: 2
ImplementsRunnable counter: 3
ExtendsThread counter: 1
ExtendsThread counter: 2
ExtendsThread counter: 1
ExtendsThread counter: 3
ExtendsThread counter: 2
ExtendsThread counter: 3

Runable Callable區別

1.Runnable 是JDK1.0 版本就有的類,而Callable是JDK1.5之後纔有的類,所以Callable比Runnable高級
2.高級的地方:可以有返回值,可以拋出異常

Future(Callable返回的結果)

這裏寫圖片描述

FutureTask爲Future的具體實現
執行Callable.call()的時候,直接構造了Future對象,將Callable對象傳入
FutueTask對象中維護Running Completed Exception字段,代表這任務是否完成
當調用Future.get()返回結果值的時候,如果爲Running狀態,調用object.wait()方法,使線程處於等待狀態,如果線程完成時候,調用object.notifyAll(),喚醒等待線程,繼續執行,getValue()返回結果

RunnableFuture(具體實現就是FutureTask)

同時繼承了Runable Future接口,提供了run() 和 返回結果的接口

Executor ExecutorService

對Runnable Callable通過啓動線程異步啓動
對傳遞過來的Runnable Callable進行包裝,包裝爲FutureTask

引用資料

http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章