日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java终结方法_Java终结任务:Callable和Future

發(fā)布時(shí)間:2025/3/15 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java终结方法_Java终结任务:Callable和Future 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在這里首先介紹下Callable和Future,我們知道通常創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實(shí)現(xiàn)Runnable接口,但是這兩種方式創(chuàng)建的線程不返回結(jié)果,而Callable是和Runnable類似的接口定義,但是通過(guò)實(shí)現(xiàn)Callable接口創(chuàng)建的線程可以有返回值,返回值類型可以任意定義。

Callable接口

public interface Callable {

/**

* Computes a result, or throws an exception if unable to do so.

*

* @return computed result

* @throws Exception if unable to compute a result

*/

V call() throws Exception;

}

可以看到,這是一個(gè)泛型接口,call()函數(shù)返回的類型就是傳遞進(jìn)來(lái)的V類型。

那么怎么使用Callable呢?一般情況下是配合ExecutorService來(lái)使用的,在ExecutorService接口中聲明了若干個(gè)submit方法的重載版本:

Future submit(Callable task);

Future submit(Runnable task, T result);

Future> submit(Runnable task);

第一個(gè)submit方法里面的參數(shù)類型就是Callable。Callable一般是和ExecutorService配合來(lái)使用的,通過(guò)ExecutorService的實(shí)例submit得到Future對(duì)象。

Future

Future接口如下:

public interface Future {

boolean cancel(boolean mayInterruptIfRunning);// 試圖取消對(duì)此任務(wù)的執(zhí)行

boolean isCancelled(); // 如果在任務(wù)正常完成前將其取消,則返回true

boolean isDone(); // 如果任務(wù)已完成(不管是正常還是異常),則返回true

V get() throws InterruptedException, ExecutionException; // 方法用來(lái)獲取執(zhí)行結(jié)果,這個(gè)方法會(huì)產(chǎn)生阻塞,會(huì)一直等到任務(wù)執(zhí)行完畢才返回;

// 用來(lái)獲取執(zhí)行結(jié)果,如果在指定時(shí)間內(nèi),還沒(méi)獲取到結(jié)果,就直接返回null;

V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

}

Future用于表示異步計(jì)算的結(jié)果。它的實(shí)現(xiàn)類是FutureTask。

如果不想分支線程阻塞主線程,又想取得分支線程的執(zhí)行結(jié)果,就用FutureTask

FutureTask實(shí)現(xiàn)了RunnableFuture接口,這個(gè)接口的定義如下:

public interface RunnableFuture extends Runnable, Future

{

void run();

}

可以看出RunnableFuture繼承了Runnable接口和Future接口,而FutureTask實(shí)現(xiàn)了RunnableFuture接口。所以它既可以作為Runnable被線程執(zhí)行,又可以作為Future得到Callable的返回值。

使用示例

package demo.future;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.*;

/**

* 試驗(yàn) Java 的 Future 用法

*/

public class FutureTest {

public static class Task implements Callable {

@Override

public String call() throws Exception {

String tid = String.valueOf(Thread.currentThread().getId());

System.out.printf("Thread#%s : in call\n", tid);

return tid;

}

}

public static void main(String[] args) throws InterruptedException, ExecutionException {

List> results = new ArrayList>();

ExecutorService es = Executors.newCachedThreadPool();

for(int i=0; i<100;i++)

results.add(es.submit(new Task()));

for(Future res : results)

System.out.println(res.get());

}

}

終結(jié)任務(wù)

持有Future對(duì)象,可以調(diào)用cancel(),并因此可以使用它來(lái)中斷某個(gè)特定任務(wù),如果將ture傳遞給cancel(),那么它就會(huì)擁有該線程上調(diào)用interrupt()以停止這個(gè)線程的權(quán)限。因此,cancel()是一種中斷由Executor啟動(dòng)的單個(gè)線程的方式。

cancel()一般是搭配get()方法來(lái)使用的。比方說(shuō),有一種設(shè)計(jì)模式是設(shè)定特定的時(shí)間,然后去執(zhí)行一個(gè)作業(yè)的線程,如果該作業(yè)能夠在設(shè)定的時(shí)間內(nèi)執(zhí)行完畢,則直接返回結(jié)果,如果不能執(zhí)行完畢,則中斷作業(yè)的執(zhí)行,繼續(xù)執(zhí)行下一個(gè)作業(yè),在這種模式下,使用Callable和Future來(lái)實(shí)現(xiàn)是一個(gè)非常好的解決方案。

總結(jié)

以上是生活随笔為你收集整理的java终结方法_Java终结任务:Callable和Future的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。