这篇文章主要讲解了“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不但可以获取提交任务的执行结果,甚至还可以取消任务。
摘自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
@ToString
class MyResult {
private String code;
}
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如何使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。