Java并发工具类Future使用示例

目录

  • 前言
  • Future使用示例
  • FutureTask

前言 Future是一个接口类,定义了5个方法:
boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

【Java并发工具类Future使用示例】通过这5个方法可以看出,Future不但可以获取提交任务的执行结果,甚至还可以取消任务。

Future使用示例 摘自JDK中Future示例代码
class ArchiveSearcherImpl implements ArchiveSearcher{@Overridepublic 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 {// 提交任务Future future= executor.submit(new Callable() {public String call() {return searcher.search(target); }}); displayOtherThings(); // do other things while searchingtry {// 拿任务执行结果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()方法是阻塞式的,如果调用该方法的时候任务尚未执行完成,则会一直等待下去,直到任务执行结束。
ExecutorService还有一个sumbit方法比较特殊: Future submit(Runnable task, T result); 这个方法可以先把result这个参数传给task使用,然后再通过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); // 提交任务后,在任务中操作myResultFuture future = executor.submit(myTask, myResult); // 最后get方法可以拿到myResultSystem.out.println(future.get()); }}class MyTask implements Runnable {private MyResult myResult; public MyTask(MyResult myResult) {this.myResult = myResult; }@Overridepublic void run() {myResult.setCode("10000"); }}@Data@ToStringclass MyResult {private String code; }


FutureTask FutureTask是一个实现了Runnable和Future接口的工具类,结合了这两个接口的能力,FutureTask即可以提交给线程任务执行,又可以获取到执行结果。
具体代码示例:
import java.util.concurrent.*; public class FutureTaskTest {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask futureTask1 = new FutureTask<>(new MyTask1()); FutureTask 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 {@Overridepublic String call() {try {Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); }return "MyTask2 over"; }}class MyTask1 implements Callable {@Overridepublic String call() {try {Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace(); }return "MyTask1 over"; }}

到此这篇关于Java并发工具类Future使用示例的文章就介绍到这了,更多相关Java并发工具类Future内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读