Java并發(fā)工具類Future使用示例
前言
Future是一個(gè)接口類,定義了5個(gè)方法:
boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
通過(guò)這5個(gè)方法可以看出,F(xiàn)uture不但可以獲取提交任務(wù)的執(zhí)行結(jié)果,甚至還可以取消任務(wù)。
Future使用示例
摘自JDK中Future示例代碼
class ArchiveSearcherImpl implements ArchiveSearcher{
@Override
public String search(String target) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return target;
}
}
interface ArchiveSearcher {
String search(String target);
}
class App {
public static void main(String[] args) throws InterruptedException {
App app = new App();
app.showSearch("search");
}
ExecutorService executor = Executors.newSingleThreadExecutor();
ArchiveSearcher searcher = new ArchiveSearcherImpl();
void showSearch(final String target)
throws InterruptedException {
// 提交任務(wù)
Future<String> future
= executor.submit(new Callable<String>() {
public String call() {
return searcher.search(target);
}
});
displayOtherThings(); // do other things while searching
try {
// 拿任務(wù)執(zhí)行結(jié)果
displayText(future.get()); // use future
} catch (ExecutionException ex) {
//cleanup();
return;
}
}
private void displayOtherThings() {
System.out.println("do other things");
}
private void displayText(String s) {
System.out.println(s);
}
}
注意:future.get()方法是阻塞式的,如果調(diào)用該方法的時(shí)候任務(wù)尚未執(zhí)行完成,則會(huì)一直等待下去,直到任務(wù)執(zhí)行結(jié)束。
ExecutorService還有一個(gè)sumbit方法比較特殊:<T> Future<T> submit(Runnable task, T result);這個(gè)方法可以先把result這個(gè)參數(shù)傳給task使用,然后再通過(guò)get方法把result返回。
public class FutureTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
MyResult myResult = new MyResult();
MyTask myTask = new MyTask(myResult);
// 提交任務(wù)后,在任務(wù)中操作myResult
Future<MyResult> future = executor.submit(myTask, myResult);
// 最后get方法可以拿到myResult
System.out.println(future.get());
}
}
class MyTask implements Runnable {
private MyResult myResult;
public MyTask(MyResult myResult) {
this.myResult = myResult;
}
@Override
public void run() {
myResult.setCode("10000");
}
}
@Data
@ToString
class MyResult {
private String code;
}
FutureTask
FutureTask是一個(gè)實(shí)現(xiàn)了Runnable和Future接口的工具類,結(jié)合了這兩個(gè)接口的能力,F(xiàn)utureTask即可以提交給線程任務(wù)執(zhí)行,又可以獲取到執(zhí)行結(jié)果。
具體代碼示例:
import java.util.concurrent.*;
public class FutureTaskTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask1 = new FutureTask<>(new MyTask1());
FutureTask<String> futureTask2 = new FutureTask<>(new MyTask2());
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(futureTask1);
executorService.submit(futureTask2);
long start = System.currentTimeMillis();
System.out.println(futureTask1.get());
System.out.println(futureTask2.get());
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}
class MyTask2 implements Callable<String> {
@Override
public String call() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "MyTask2 over";
}
}
class MyTask1 implements Callable<String> {
@Override
public String call() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "MyTask1 over";
}
}
到此這篇關(guān)于Java并發(fā)工具類Future使用示例的文章就介紹到這了,更多相關(guān)Java并發(fā)工具類Future內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring DeferredResult異步操作使用場(chǎng)景
本文主要介紹了Spring DeferredResult異步操作使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Spring?MVC中JSON數(shù)據(jù)處理方式實(shí)戰(zhàn)案例
Spring MVC是個(gè)靈活的框架,返回JSON數(shù)據(jù)的也有很多五花八門的方式,下面這篇文章主要給大家介紹了關(guān)于Spring?MVC中JSON數(shù)據(jù)處理方式的相關(guān)資料,需要的朋友可以參考下2024-01-01
Java基礎(chǔ)之淺談hashCode()和equals()
今天給大家?guī)?lái)的是關(guān)于Java基礎(chǔ)的相關(guān)知識(shí),文章圍繞著hashCode()和equals()展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Java?8函數(shù)式接口之BinaryOperator使用示例詳解
這篇文章主要大家介紹了Java?8函數(shù)式接口之BinaryOperator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Dubbo異步調(diào)用的實(shí)現(xiàn)介紹
dubbo默認(rèn)使用同步的方式調(diào)用。但在有些特殊的場(chǎng)景下,我們可能希望異步調(diào)用dubbo接口,從而避免不必要的等待時(shí)間,這時(shí)候我們就需要用到異步。那么dubbo的異步是如何實(shí)現(xiàn)的呢?下面就來(lái)看看這個(gè)問(wèn)題2022-09-09
Spring Boot 直接用jar運(yùn)行項(xiàng)目的方法
這篇文章主要介紹了Spring Boot 直接用jar運(yùn)行項(xiàng)目的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2018-02-02

