首先聲明,此博文和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