1. 程式人生 > >執行緒3種常用的實現方式

執行緒3種常用的實現方式

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();
                }
            }
        });
    }
}}