執行緒3種常用的實現方式
阿新 • • 發佈:2019-02-07
1. 執行緒有幾種實現方法?說出來。
1. 繼承Thread類
萬物皆物件,那麼執行緒也是物件,物件就應該能夠抽取其公共特性封裝成為類,使用類可以例項化多個物件,那麼實現執行緒的第一種方式就是繼承Thread類的方式。繼承Thread類是最簡單的一種實現執行緒的方式,通過jdk給我們提供的Thread類,重寫Thread類的run方法即可,那麼當執行緒啟動的時候,就會執行run方法體的內容。
public class ThreadDemo extends Thread {
@Override public void run() { while (true) { System.out.println(Thread.currentThread().getName() + " is running ... "); // 列印當前執行緒的名字 try { Thread.sleep(1000); // 休息1000ms } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); td.start(); // 啟動執行緒 while (true) { System.out.println(Thread.currentThread().getName() + " is running ... "); // 列印當前執行緒的名字 try { Thread.sleep(1000); // 休息1000ms } catch (InterruptedException e) { e.printStackTrace(); } } }
}
2.實現Runnable介面
實現Runnable介面也是一種常見的建立執行緒的方式。使用介面的方式可以讓我們的程式降低耦合度。Runnable介面中僅僅定義了一個方法,就是run。
其實Runnable就是一個執行緒任務,執行緒任務和執行緒的控制分離,這也就是上面所說的解耦。我們要實現一個執行緒,可以藉助Thread類,Thread類要執行的任務就可以由實現了Runnable介面的類來處理。
執行緒任務類程式碼如下
public class ThreadTarget implements Runnable {
@Override public void run() { while(true) { System.out.println(Thread.currentThread().getName() + " is running .. "); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
可執行類程式碼如下
public class Main {
public static void main(String[] args) { ThreadTarget tt = new ThreadTarget(); // 例項化執行緒任務類 Thread t = new Thread(tt); // 建立執行緒物件,並將執行緒任務類作為構造方法引數傳入 t.start(); // 啟動執行緒 // 主執行緒的任務,為了演示多個執行緒一起執行 while(true) { System.out.println(Thread.currentThread().getName() + " is running .. "); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
3.基於執行緒池的方式
我們知道,執行緒和資料庫連線這些資源都是非常寶貴的資源。那麼每次需要的時候建立,不需要的時候銷燬,是非常浪費資源的。那麼我們就可以使用快取的策略,也就是使用執行緒池。當然了,執行緒池也不需要我們來實現,jdk的官方也給我們提供了API。
public static void main(String[] args) {
// 建立執行緒池
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(true) {
threadPool.execute(new Runnable() { // 提交多個執行緒任務,並執行
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " is running ..");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}}