Java創建多線程的四種方式以及優缺點

java有以下四種創建多線程的方式

  • 1:繼承Thread類創建線程

  • 2:實現Runnable接口創建線程

  • 3:使用Callable和FutureTask創建線程

  • 4:使用線程池,例如用Executor框架創建線程

DEMO代碼

package thread;
 
import java.util.concurrent.*;
 

public class ThreadTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
//      創建線程的第一種方法
        Thread1 thread1 = new Thread1();
        thread1.start();
 
//      創建線程的第二種方法
        Thread2 thread2 = new Thread2();
        Thread thread = new Thread(thread2);
        thread.start();
 
//      創建線程的第三種方法
        Callable<String> callable = new Thread3();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        Thread thread3 = new Thread(futureTask);
        thread3.start();
        String s = futureTask.get();
        System.out.println(s);
 
//      創建線程的第四種方法
        Executor executor = Executors.newFixedThreadPool(5);
        executor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread()+"創建線程的第四種方法");
            }
        });
        ((ExecutorService) executor).shutdown();
 
    }
}
class Thread1 extends Thread{
    @Override
    public void run() {
        System.out.println(Thread.currentThread()+"創建線程的第一種方法");
    }
}
 
class Thread2 implements Runnable {
 
    @Override
    public void run() {
        System.out.println(Thread.currentThread()+"創建線程的第二種方法");
    }
}
 
class Thread3 implements Callable<String> {
 
    @Override
    public String call() throws Exception {
        return Thread.currentThread()+"創建線程的第三種方法";
    }
}

創建線程的三種方式的對比

1、採用實現Runnable、Callable接口的方式創建多線程

  優勢:

   線程類只是實現了Runnable接口或Callable接口,還可以繼承其他類。

   在這種方式下,多個線程可以共享同一個target對象,所以非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。

   劣勢:

 編程稍微複雜,如果要訪問當前線程,則必須使用Thread.currentThread()方法。

2、使用繼承Thread類的方式創建多線程

  優勢:

  編寫簡單,如果需要訪問當前線程,則無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程。

  劣勢:

  線程類已經繼承了Thread類,所以不能再繼承其他父類。

3、Runnable和Callable的區別

Runnable接口定義的run方法,Callable定義的是call方法。
run方法沒有返回值,call方法必須有返回值。
run方法無法拋出異常,call方法可以拋出checked exception。
Callable和Runnable都可以應用於executors。而Thread類只支持Runnable.

總結

鑑於上面分析,因此一般推薦採用實現Runnable接口、Callable接口的方式來創建多線程。

如果大家對java架構相關感興趣,可以關注下面公衆號,會持續更新java基礎面試題, netty, spring boot,spring cloud等系列文章,一系列乾貨隨時送達, 超神之路從此展開, BTAJ不再是夢想!

架構殿堂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章