大家都說Java有三種建立執行緒的方式!並行程式設計中的驚天騙局!

2023-06-09 21:01:30

在Java中,建立執行緒是一項非常重要的任務。執行緒是一種輕量級的子程序,可以並行執行,使得程式的執行效率得到提高。Java提供了多種方式來建立執行緒,但許多人都認為Java有三種建立執行緒的方式,它們分別是繼承Thread類、實現Runnable介面和使用執行緒池。

但是,你們知道嗎?其實在建立執行緒的過程中,除了上述描述的方法還有很多種方式可以選擇哦。今天,我們就來揭開這個驚天祕密,一起來了解一下Java並行程式設計中建立執行緒的八股文。

一. 建立執行緒的方法:

1. 繼承Thread類建立執行緒

這是最基本的建立執行緒的方式,我們可以通過繼承Thread類來建立一個自定義的執行緒類,然後重寫run()方法,實現執行緒的邏輯。

public class MyThread extends Thread {
    @Override
    public void run() {
        // 執行緒邏輯
    }
}

// 建立並啟動執行緒
MyThread myThread = new MyThread();
myThread.start();

2. 實現Runnable介面建立執行緒

這是另一種常見的建立執行緒的方式,我們可以通過實現Runnable介面來建立一個自定義的執行緒類,然後將該類範例化並傳遞給Thread類的構造方法中,最後呼叫start()方法啟動執行緒。

public class MyRunnable implements Runnable {

@Override

public void run() {

// 執行緒邏輯

}

}

// 建立並啟動執行緒

MyRunnable myRunnable = new MyRunnable();

Thread thread = new Thread(myRunnable);

thread.start();

3. 實現Callable介面建立執行緒

Callable介面與Runnable介面類似,但是它可以返回一個結果並丟擲異常。我們可以通過實現Callable介面來建立一個自定義的執行緒類,然後將該類範例化並傳遞給FutureTask類的構造方法中,最後呼叫start()方法啟動執行緒。

public class MyCallable implements Callable {

@Override

public String call() throws Exception {

// 執行緒邏輯

return "result";

}

}

// 建立並啟動執行緒

MyCallable myCallable = new MyCallable();

FutureTask futureTask = new FutureTask<>(myCallable);

Thread thread = new Thread(futureTask);

thread.start();

// 獲取執行緒返回結果

String result = futureTask.get();

4. 使用執行緒池建立執行緒

執行緒池是一種重用執行緒的機制,可以減少執行緒建立和銷燬的開銷。我們可以通過Executors類提供的靜態方法來建立不同型別的執行緒池,然後將任務提交給執行緒池執行。

ExecutorService executorService = Executors.newFixedThreadPool(10);

// 提交任務並執行

executorService.submit(new Runnable() {

@Override

public void run() {

// 執行緒邏輯

}

});

// 關閉執行緒池

executorService.shutdown();

5. 使用定時器建立執行緒

定時器可以用來定時執行某個任務。我們可以通過Timer類來建立一個定時器,然後將任務新增到定時器中執行。

6. 使用ScheduledExecutorService建立執行緒

ScheduledExecutorService是一種可以排程任務執行的執行緒池。我們可以通過它來建立一個定時任務,也可以建立一個週期性任務。

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);

// 建立定時任務並執行
scheduledExecutorService.schedule(new Runnable() {
    @Override
    public void run() {
        // 執行緒邏輯
    }
}, 1, TimeUnit.SECONDS);

// 建立週期性任務並執行
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        // 執行緒邏輯
    }
}, 1, 1, TimeUnit.SECONDS);

// 關閉執行緒池
scheduledExecutorService.shutdown();

7. 使用Fork/Join框架建立執行緒

Fork/Join框架是Java 7中引入的一種並行執行任務的機制。它可以將一個大任務拆分成多個小任務並行執行,最後將結果合併。

public class MyTask extends RecursiveTask {
    private int start;
    private int end;

    public MyTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        if (end - start <= 1000) {
            // 執行小任務
            return 0;
        } else {
            // 拆分大任務
            int mid = (start + end) / 2;
            MyTask leftTask = new MyTask(start, mid);
            MyTask rightTask = new MyTask(mid + 1, end);
            leftTask.fork();
            rightTask.fork();

            // 合併結果
            return leftTask.join() + rightTask.join();
        }
    }
}

// 建立並執行任務
ForkJoinPool forkJoinPool = new ForkJoinPool();
MyTask myTask = new MyTask(1, 10000);
int result = forkJoinPool.invoke(myTask);

8. 使用Semaphore建立執行緒

Semaphore是一種計數器,用來控制同時存取某個資源的執行緒數量。我們可以通過Semaphore來建立一個有限的執行緒池。

Semaphore semaphore = new Semaphore(10);

// 建立並執行任務
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        try {
            semaphore.acquire();
            // 執行緒邏輯
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }
    }
};

for (int i = 0; i < 100; i++) {
    new Thread(runnable).start();
}

二. 執行緒和執行緒體的關係

說到執行緒大家都知道,它是一種重要的多工處理機制。可以讓我們同時執行多個任務,並且可以提高程式的效率。 上述也給大家帶來了很多種建立執行緒的方式,但是說到這裡,我發現經常有朋友問:執行緒體和執行緒是什麼關係?其實,簡單說:執行緒體就是是執行緒的具體執行程式碼。那麼接下來就讓我們具體來看看執行緒和執行緒體的關係吧!

1. 執行緒和執行緒體的關係

在Java中,執行緒和執行緒體是兩個不同的概念。

執行緒是一條執行路徑,執行緒體是執行緒的具體執行程式碼。 每個執行緒都有一個與之相關的執行緒體。執行緒體是實現了Runnable介面的類的範例。執行緒體可以是一個獨立的類,也可以是一個內部類。執行緒建立之後,它的run()方法就會被呼叫,run()方法中的程式碼就是執行緒體的執行程式碼。

2. 案例說明

可能會有朋友覺得上述的解釋過於書面化,那麼如果通過生活範例來說明執行緒體和執行緒的關係的話,我們可以將執行緒理解成為一個人,執行緒體則是這個人所做的事情。

比如,在上班的路上,我們可以同時進行多個任務,比如聽音樂、看書、傳簡訊等等。這些任務就可以看做是這個人的執行緒體。執行緒就是這個人同時進行多個任務的機制。如果我們只有一個人,那麼這個人必須先做完一個任務才能開始做下一個任務。這樣就會浪費很多時間。但是如果我們有兩個人,那麼一個人可以看書,另一個人可以聽音樂,這樣就可以同時進行多個任務,提高了效率。

3. 程式碼案例

下面給大家帶來一個:建立多個執行緒來同時執行多個任務的簡單的程式碼案例,範例如下:

public class MyThread implements Runnable {
    private String taskName;

    public MyThread(String taskName) {
        this.taskName = taskName;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(taskName + "執行了第" + (i + 1) + "次任務");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread("執行緒1");
        MyThread thread2 = new MyThread("執行緒2");
        Thread t1 = new Thread(thread1);
        Thread t2 = new Thread(thread2);
        t1.start();
        t2.start();
    }
}

在這個案例中,我們建立了兩個執行緒,分別執行不同的任務。每個執行緒的執行緒體是MyThread類的run()方法。在run()方法中,每個執行緒會執行5次任務,並在每次任務之間暫停1秒鐘。通過建立多個執行緒,我們可以同時執行多個任務,提高程式的效率。

4. 小結

通過上述介紹的Java執行緒和執行緒體的關係,大家應該都清楚了。執行緒是一種多工處理機制,執行緒體是執行緒的具體執行程式碼。在Java中,我們可以通過建立多個執行緒來同時執行多個任務,提高程式的效率。希望上述可以幫助大家更好地理解Java中執行緒和執行緒體的概念哦。

三. 總結

現在大家都知道了在Java並行程式設計中,建立執行緒是一個非常重要的操作。

本文給大家介紹了八種不同的建立執行緒的方式,包括繼承Thread類、實現Runnable介面、實現Callable介面、使用執行緒池、使用定時器、使用ScheduledExecutorService、使用Fork/Join框架和使用Semaphore。

每種方式都有各自的優缺點,我們需要根據實際情況選擇合適的方式來建立執行緒。同時,我們還需要注意執行緒安全和效能等問題,確保程式的正確性和高效性。

在生活中,我們也可以找到很多與多執行緒程式設計相關的例子。比如,在廚房裡做飯的時候,我們可以將不同的任務分配給不同的人來完成,比如一個人負責洗菜,一個人負責切菜,一個人負責燒菜等等。這樣可以提高效率,也可以避免出現混亂和錯誤。同樣,在程式中,我們也可以將不同的任務分配給不同的執行緒來完成,以提高程式的響應速度和吞吐量。因此,多執行緒程式設計是非常重要的,值得我們深入學習和掌握。希望能對大家有所幫助哦。