Java并发工具类Future如何使用
这篇文章主要讲解了“Java并发工具类Future如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发工具类Future如何使用”吧!
前言
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;
通过这5个方法可以看出,Future不但可以获取提交任务的执行结果,甚至还可以取消任务。
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 { // 提交任务 Future<String> future = executor.submit(new Callable<String>() { public String call() { return searcher.search(target); } }); displayOtherThings(); // do other things while searching try { // 拿任务执行结果 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方法比较特殊:<T> Future<T> 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);// 提交任务后,在任务中操作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@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<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"; }}
感谢各位的阅读,以上就是“Java并发工具类Future如何使用”的内容了,经过本文的学习后,相信大家对Java并发工具类Future如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341