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不再是夢想!