詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)
java有以下四種創(chuàng)建多線程的方式
1:繼承Thread類(lèi)創(chuàng)建線程
2:實(shí)現(xiàn)Runnable接口創(chuàng)建線程
3:使用Callable和FutureTask創(chuàng)建線程
4:使用線程池,例如用Executor框架創(chuàng)建線程
DEMO代碼
package thread;
import java.util.concurrent.*;
public class ThreadTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 創(chuàng)建線程的第一種方法
Thread1 thread1 = new Thread1();
thread1.start();
// 創(chuàng)建線程的第二種方法
Thread2 thread2 = new Thread2();
Thread thread = new Thread(thread2);
thread.start();
// 創(chuàng)建線程的第三種方法
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);
// 創(chuàng)建線程的第四種方法
Executor executor = Executors.newFixedThreadPool(5);
executor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread()+"創(chuàng)建線程的第四種方法");
}
});
((ExecutorService) executor).shutdown();
}
}
class Thread1 extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread()+"創(chuàng)建線程的第一種方法");
}
}
class Thread2 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread()+"創(chuàng)建線程的第二種方法");
}
}
class Thread3 implements Callable<String> {
@Override
public String call() throws Exception {
return Thread.currentThread()+"創(chuàng)建線程的第三種方法";
}
}
創(chuàng)建線程的三種方式的對(duì)比
1、采用實(shí)現(xiàn)Runnable、Callable接口的方式創(chuàng)建多線程
優(yōu)勢(shì):
線程類(lèi)只是實(shí)現(xiàn)了Runnable接口或Callable接口,還可以繼承其他類(lèi)。
在這種方式下,多個(gè)線程可以共享同一個(gè)target對(duì)象,所以非常適合多個(gè)相同線程來(lái)處理同一份資源的情況,從而可以將CPU、代碼和數(shù)據(jù)分開(kāi),形成清晰的模型,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
劣勢(shì):
編程稍微復(fù)雜,如果要訪問(wèn)當(dāng)前線程,則必須使用Thread.currentThread()方法。
2、使用繼承Thread類(lèi)的方式創(chuàng)建多線程
優(yōu)勢(shì):
編寫(xiě)簡(jiǎn)單,如果需要訪問(wèn)當(dāng)前線程,則無(wú)需使用Thread.currentThread()方法,直接使用this即可獲得當(dāng)前線程。
劣勢(shì):
線程類(lèi)已經(jīng)繼承了Thread類(lèi),所以不能再繼承其他父類(lèi)。
3、Runnable和Callable的區(qū)別
Runnable接口定義的run方法,Callable定義的是call方法。
run方法沒(méi)有返回值,call方法必須有返回值。
run方法無(wú)法拋出異常,call方法可以拋出checked exception。
Callable和Runnable都可以應(yīng)用于executors。而Thread類(lèi)只支持Runnable.
總結(jié)
鑒于上面分析,因此一般推薦采用實(shí)現(xiàn)Runnable接口、Callable接口的方式來(lái)創(chuàng)建多線程。
到此這篇關(guān)于Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)的文章就介紹到這了,更多相關(guān)Java創(chuàng)建多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot3整合Nacos?V2.3.2的詳細(xì)過(guò)程
本文介紹了如何在?Spring?Boot?3.2.x?項(xiàng)目中整合?Nacos?2.3.2,包括依賴配置、Nacos?服務(wù)發(fā)現(xiàn)與動(dòng)態(tài)配置的配置方法,通過(guò)整合?Nacos,Spring?Boot?應(yīng)用可以實(shí)現(xiàn)高效的服務(wù)發(fā)現(xiàn)、動(dòng)態(tài)配置管理以及分布式系統(tǒng)中的靈活擴(kuò)展,感興趣的朋友跟隨小編一起看看吧2024-11-11
idea +junit單元測(cè)試獲取不到bean注入的解決方式
這篇文章主要介紹了idea +junit單元測(cè)試獲取不到bean注入的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
spring mvc 組合mybatis框架實(shí)例詳解
本項(xiàng)目采用 maven 結(jié)構(gòu),主要演示了 spring mvc + mybatis,controller 獲取數(shù)據(jù)后以json 格式返回?cái)?shù)據(jù)。對(duì)spring mvc 組合mybatis的方法感興趣的朋友可以參考下本文2018-01-01
關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼
今天小編就為大家分享一篇關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
詳解如何為SpringBoot Web應(yīng)用的日志方便追蹤
在Web應(yīng)用程序領(lǐng)域,有效的請(qǐng)求監(jiān)控和可追溯性對(duì)于維護(hù)系統(tǒng)完整性和診斷問(wèn)題至關(guān)重要,SpringBoot是一種用于構(gòu)建Java應(yīng)用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下2023-11-11

