詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)
java有以下四種創(chuàng)建多線程的方式
1:繼承Thread類創(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ì):
線程類只是實(shí)現(xiàn)了Runnable接口或Callable接口,還可以繼承其他類。
在這種方式下,多個(gè)線程可以共享同一個(gè)target對(duì)象,所以非常適合多個(gè)相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數(shù)據(jù)分開,形成清晰的模型,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
劣勢(shì):
編程稍微復(fù)雜,如果要訪問當(dāng)前線程,則必須使用Thread.currentThread()方法。
2、使用繼承Thread類的方式創(chuàng)建多線程
優(yōu)勢(shì):
編寫簡(jiǎn)單,如果需要訪問當(dāng)前線程,則無需使用Thread.currentThread()方法,直接使用this即可獲得當(dāng)前線程。
劣勢(shì):
線程類已經(jīng)繼承了Thread類,所以不能再繼承其他父類。
3、Runnable和Callable的區(qū)別
Runnable接口定義的run方法,Callable定義的是call方法。
run方法沒有返回值,call方法必須有返回值。
run方法無法拋出異常,call方法可以拋出checked exception。
Callable和Runnable都可以應(yīng)用于executors。而Thread類只支持Runnable.
總結(jié)
鑒于上面分析,因此一般推薦采用實(shí)現(xiàn)Runnable接口、Callable接口的方式來創(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)文章
SpringBoot整合Mybatis與thymleft實(shí)現(xiàn)增刪改查功能詳解
MybatisPlus是國(guó)產(chǎn)的第三方插件,?它封裝了許多常用的CURDapi,免去了我們寫mapper.xml的重復(fù)勞動(dòng)。本文將整合MybatisPlus實(shí)現(xiàn)增刪改查功能,感興趣的可以了解一下2022-12-12Java設(shè)計(jì)模式之觀察者模式observer?pattern詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式observer?pattern詳解,當(dāng)一個(gè)對(duì)象發(fā)生數(shù)據(jù)變化時(shí),通知其他相關(guān)的一系列對(duì)象,接受到通知的對(duì)象根據(jù)該對(duì)象的變化進(jìn)行相應(yīng)處理以響應(yīng)變化的過程,需要的朋友可以參考下2023-12-12java 8 lambda表達(dá)式list操作分組、過濾、求和、最值、排序、去重代碼詳解
java8的lambda表達(dá)式提供了一些方便list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Java 實(shí)現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤
分布式服務(wù)中完成某一個(gè)業(yè)務(wù)動(dòng)作,需要服務(wù)之間的相互協(xié)作才能完成,在這一次動(dòng)作引起的多服務(wù)的聯(lián)動(dòng)我們需要用1個(gè)唯一標(biāo)識(shí)關(guān)聯(lián)起來,關(guān)聯(lián)起來就是調(diào)用鏈的跟蹤。本文介紹了Java 實(shí)現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤的步驟2021-06-06淺析 ArrayList 和 LinkedList 有什么區(qū)別
ArrayList 和 LinkedList 有什么區(qū)別,是面試官非常喜歡問的一個(gè)問題。今天通過本文給大家詳細(xì)介紹下,感興趣的朋友跟隨小編一起看看吧2020-10-10Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡(jiǎn)單定義與使用方法
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的簡(jiǎn)單定義與使用方法,簡(jiǎn)單描述了隊(duì)列的功能、特點(diǎn),并結(jié)合java實(shí)例形式分析了隊(duì)列的簡(jiǎn)單定義與使用方法,需要的朋友可以參考下2017-10-10IDEA?報(bào)Plugin'maven-resources-plugin:'not?found?
如果在使用?IDEA?時(shí)遇到?"Plugin?'maven-resources-plugin:'?not?found"?錯(cuò)誤,可能是由于?Maven?倉(cāng)庫(kù)中未找到所需的?Maven?插件,近小編給大家分享幾種解決方法,感興趣的朋友跟隨小編一起看看吧2023-07-07SpringAop實(shí)現(xiàn)原理及代理模式詳解
Spring的AOP就是通過動(dòng)態(tài)代理實(shí)現(xiàn)的,使用了兩個(gè)動(dòng)態(tài)代理,分別是JDK的動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理,本文重點(diǎn)給大家介紹下SpringAop實(shí)現(xiàn)原理及代理模式,感興趣的朋友一起看看吧2022-04-04Spring?Boot實(shí)現(xiàn)第一次啟動(dòng)時(shí)自動(dòng)初始化數(shù)據(jù)庫(kù)流程詳解
在現(xiàn)在的后端開發(fā)中,只要是使用關(guān)系型數(shù)據(jù)庫(kù),相信SSM架構(gòu)(Spring?Boot?+?MyBatis)已經(jīng)成為首選,本文就以Spring?Boot?+?MyBatis為例,使用MySQL作為數(shù)據(jù)庫(kù),完成數(shù)據(jù)庫(kù)初始化功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-05-05