Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))
Java中的Runable,Callable,Future,FutureTask,ExecutorService,Excetor,Excutors,ThreadPoolExcetor在這里對(duì)這些關(guān)鍵詞,以及它們的用法做一個(gè)總結(jié)。
首先將它們分個(gè)類:
Runable,Callable
Future,FutureTask
ExecutorService,Excetor,Excutors,ThreadPoolExcetor
1. 關(guān)于Ranable和Callable
首先Java中創(chuàng)建線程的方法有三種:
- 繼承Thread類,覆蓋run方法
- 實(shí)現(xiàn)Runable接口,實(shí)現(xiàn)run方法
- 實(shí)現(xiàn)Callable接口,實(shí)現(xiàn)run方法
三種實(shí)現(xiàn)的優(yōu)缺點(diǎn):
繼承Thread,單繼承的緣故,不能再繼承其他類,獲取當(dāng)前線程this
實(shí)現(xiàn)Runable接口,沒有返回值,獲取當(dāng)前線程Thread.currentThread()
實(shí)現(xiàn)Callable接口,可通過Future.get()獲取返回值,獲取當(dāng)前線程 Thread.currentThread()
繼承Thread,兩個(gè)步驟:
class DemoThread extends Thread { @Override public void run() { super.run(); // Perform time-consuming operation... } } DemoThread t = new DemoThread(); t.start();
- 繼承Thread類,覆蓋run()方法。
- 創(chuàng)建線程對(duì)象并用start()方法啟動(dòng)線程。
實(shí)現(xiàn)Runable,一般使用如下:
new Thread(new Runnable() { @Override public void run() { // do something } }).start();
為了簡(jiǎn)單。
以上兩種方式獲取線程執(zhí)行的結(jié)果相當(dāng)麻煩,不能直接獲取。JDK1.5增加了 Callable, Callable 的 call() 方法可以返回值和拋出異常。Callable 可以返回裝載有計(jì)算結(jié)果的 Future 對(duì)象。
Callable的源碼:
public interface Callable<V> { V call() throws Exception; }
Callable的基本使用方法:
FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { // do something return null; } }); Thread thread = new Thread(futureTask); thread.start(); Integer result = futureTask.get();
運(yùn)行 Callable 任務(wù)可以拿到一個(gè) Future 對(duì)象,通過Future的get()方法拿到線程執(zhí)行的返回值。那么...Future,
FutureTask區(qū)別是什么,怎么使用?
->next()
2. 關(guān)于Future和FutureTask
為了獲取線程的執(zhí)行結(jié)果,引入了Future的FutureTask,那么他們是什么關(guān)系,如何使用?
Future類位于java.util.concurrent包下,它是一個(gè)接口:
public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
Future 定義了5個(gè)方法:
1)boolean cancel(boolean mayInterruptIfRunning):試圖取消對(duì)此任務(wù)的執(zhí)行。如果任務(wù)已完成、或已取消,或者由于某些其他原因而無(wú)法取消,則此嘗試將失敗。當(dāng)調(diào)用 cancel() 時(shí),如果調(diào)用成功,而此任務(wù)尚未啟動(dòng),則此任務(wù)將永不運(yùn)行。如果任務(wù)已經(jīng)啟動(dòng),則 mayInterruptIfRunning 參數(shù)確定是否應(yīng)該以試圖停止任務(wù)的方式來(lái)中斷執(zhí)行此任務(wù)的線程。此方法返回后,對(duì) isDone() 的后續(xù)調(diào)用將始終返回 true。如果此方法返回 true,則對(duì) isCancelled() 的后續(xù)調(diào)用將始終返回 true。
2)boolean isCancelled():如果在任務(wù)正常完成前將其取消,則返回 true。
3)boolean isDone():如果任務(wù)已完成,則返回 true。 可能由于正常終止、異常或取消而完成,在所有這些情況中,此方法都將返回 true。
4)V get()throws InterruptedException,ExecutionException:如有必要,等待計(jì)算完成,然后獲取其結(jié)果。
5)V get(long timeout,TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException: 如有必要,最多等待為使計(jì)算完成所給定的時(shí)間之后,獲取其結(jié)果(如果結(jié)果可用)。
總的來(lái)說Future提供了三種功能:
判斷任務(wù)是否完成;
能夠中斷任務(wù);
能夠獲取任務(wù)執(zhí)行結(jié)果。
重點(diǎn):
RunnableFuture繼承了Runnable接口和Future接口,而FutureTask實(shí)現(xiàn)了RunnableFuture接口。
FutureTask的實(shí)現(xiàn):
public class FutureTask<V> implements RunnableFuture<V>
RunnableFuture接口的實(shí)現(xiàn):
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }
FutureTask是Future接口的一個(gè)唯一實(shí)現(xiàn)類。
除了可以用Thread包裝FutureTask外,還有另一種使用方法:
ExecutorService executor = Executors.newCachedThreadPool(); FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { // do something return null; } }); executor.submit(futureTask); Integer result = futureTask.get();
這里用到了Executor 框架。
->next();
3. 關(guān)于ExecutorService,Excetor,Excutors,ThreadPoolExcetor
Executor框架在Java 5中被引入,Executor 框架是一個(gè)根據(jù)一組執(zhí)行策略調(diào)用、調(diào)度、執(zhí)行和控制的異步任務(wù)的框架。
在說Executor 框架之前我們需要引入一個(gè)新的概念——線程池(ThreadPoolExecutor):
public ThreadPoolExecutor(intcorePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
ThreadPoolExecutor是Executors類的底層實(shí)現(xiàn)。
在JDK幫助文檔中,有如此一段話:
“強(qiáng)烈建議程序員使用較為方便的 Executors 工廠方法 Executors.newCachedThreadPool()(無(wú)界線程池,可以進(jìn)行自動(dòng)線程回收)、Executors.newFixedThreadPool(int)(固定大小線程池)和 Executors.newSingleThreadExecutor()(單個(gè)后臺(tái)線程),它們均為大多數(shù)使用場(chǎng)景預(yù)定義了設(shè)置?!?/p>
那么ExecutorService,Excetor,Excutors都是什么?
Excetor是一個(gè)抽象層面的核心接口:
public interface Executor { void execute(Runnable command); }
ExecutorService 接口 對(duì) Executor 接口進(jìn)行了擴(kuò)展,提供了返回 Future 對(duì)象,終止,關(guān)閉線程池等方法。
public interface ExecutorService extends Executor { void shutdown(); <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; }
Executors 是一個(gè)工具類,類似于 Collections。提供工廠方法來(lái)創(chuàng)建不同類型的線程池,比如 FixedThreadPool 或 CachedThreadPool。
public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } }
以上是對(duì)Java多線程關(guān)鍵詞的整理,不至于一團(tuán)亂麻。
以上所述是小編給大家介紹的Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別
這篇文章主要介紹了Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別?,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09基于SpringBoot和Vue3的博客平臺(tái)文章列表與分頁(yè)功能實(shí)現(xiàn)
在前面的教程中,我們已經(jīng)實(shí)現(xiàn)了基于Spring Boot和Vue3的發(fā)布、編輯、刪除文章功能。本教程將繼續(xù)引導(dǎo)您實(shí)現(xiàn)博客平臺(tái)的文章列表與分頁(yè)功能,需要的朋友可以參考閱讀2023-04-04SpringBoot整合Shiro的環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合Shiro的環(huán)境搭建教程,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2022-12-12在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法
這篇文章主要介紹了在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法,CRUD是指在做計(jì)算處理時(shí)的增加(Create)、重新取得數(shù)據(jù)(Retrieve)、更新(Update)和刪除(Delete)幾個(gè)單詞的首字母簡(jiǎn)寫,需要的朋友可以參考下2016-04-04SpringCloud gateway如何修改返回?cái)?shù)據(jù)
這篇文章主要介紹了SpringCloud gateway如何修改返回?cái)?shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別淺析
這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)與重定向的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Windows10系統(tǒng)下JDK1.8環(huán)境變量的配置
今天帶大家學(xué)習(xí)在Windows10系統(tǒng)下怎么配置JDK1.8環(huán)境變量,文中有非常詳細(xì)的安裝及配置教程,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05Mybatis?TypeHandler接口及繼承關(guān)系示例解析
這篇文章主要為大家介紹了Mybatis?TypeHandler接口及繼承關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02