java多執行緒的實現方式總結
阿新 • • 發佈:2018-12-22
一個專案所用的技術往往是由業務所驅動的,平常我們寫的最多的是業務的CRUD,這是一個普遍的現象,要想往上提升,往往繞不開多執行緒知識,這篇文章是LZ對多執行緒實現的一些看法
多執行緒的三種實現方式
目前多執行緒的實現方式有三種,讓我帶您一一看來
繼承Thread類
這是我們比較熟悉的一種,廢話不多說,先來看看他的使用程式碼
public class ThreadTest {
public static void main(String[] args) {
/**
*
第一種,繼承Thread類
*/
new ThreadDemo().start();
/**
}
static class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("第一種實現方式!:繼承Thread類");
}
}
}
實現Runable介面
這也是我們比較熟悉的一種,以下是程式碼:
public class ThreadTest {
public static void main(String[] args) {
/**
*
第二種,實現runable 介面
*/
RunableDemo runableDemo=new RunableDemo();
new Thread(runableDemo).start();
}
static class RunableDemo implements Runnable{
@Override
public void run() {
System.out.println("第二種實現方式!:實現Runnable介面" );
}
}
}
實現Callable介面
這種實現方式,可能初學者見得比較少,也是先上程式碼
public class ThreadTest {
public static void main(String[] args) {
/**
*
第三種。實現callable介面
*/
CallableDemo callableDemo=new CallableDemo();
FutureTask futureTask=new FutureTask(callableDemo);
new Thread(futureTask).start();
System.out.println(futureTask.get().toString());//得到任務返回值
}
static class CallableDemo implements Callable{
@Override
public Object call() throws Exception {
System.out.println("第三種實現方式!:實現Callable介面");
return "test";;
}
}
}
三種實現方式直接的不同及關聯
三種實現方式的區別
第一種和第二種實現方式都是沒有返回值的,也是大家所熟知的,一個繼承類,一個實現介面,就不多說了,第三種方法返回了一個Object,這種實現方法可以應用於需要知道任務結果的場景
從程式碼中可以看到他的使用方式有點不一樣,多了FutureTask包裝Callable的步驟,然後再是用Thread類的start方法啟動,我們點進去FutureTask的原始碼看看:
相信您也看到了,他最終還是實現了Runnable介面。至於FutureTask,這裡就不細講了,設計到的東西就多了,您現在只要知道get()方法可以拿到任務的返回值就行。之後會細講這些
三種實現方式的關聯
三種實現方式最終都是呼叫Thread類的start方法來啟動執行緒,來看看Thread類的原始碼
看到了沒,Thread類也是實現了Runable介面,我們都知道多執行緒是用來做非同步任務的,從程式碼中可以看出run方法是具體做的事情(任務),而Thread類是裝非同步任務的一個容器,start()方法是這個容器啟動任務run()方法的鑰匙,
總結下多執行緒啟動的底層(原始碼層)必要條件:
1、Thread容器(裝任務)
2、實現Runable介面(任務)
3、呼叫Thread.start()(啟動任務容器)
之後講的執行緒池雖然看上去,沒有了這些步驟,實際上是將他們封裝到了底層了,這個之後再講。
lz有話說
這篇文章是樓主在一個週末心血來潮下筆的,第一次寫技術文章,才知道原創作者的不容易 ,lz才疏學淺,肯定有很多地方沒有注意到,如有大牛看到,望您不吝賜教