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