Java并发工具类Future使用示例(java future接口)

网友投稿 302 2022-07-26


目录前言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;

通过这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

= executor.submit(new Callable() {

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方法比较特殊: Future submit(Runnable task, T result);这个方法可以先把result这个参数传给task使用,然后再通过get方法把result返回。

public EspUOxLXeclass 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 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是一个实现了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 {

@Override

public String call() {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "MyTask2 over";

}

}

class MyTask1 implements Callable {

@Override

public String call() {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "MyTask1 over";

}

}

= executor.submit(new Callable() {

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方法比较特殊: Future submit(Runnable task, T result);这个方法可以先把result这个参数传给task使用,然后再通过get方法把result返回。

public EspUOxLXeclass 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 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是一个实现了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 {

@Override

public String call() {

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "MyTask2 over";

}

}

class MyTask1 implements Callable {

@Override

public String call() {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "MyTask1 over";

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot 项目使用hutool 工具进行 http 接口调用的处理方法(springboot项目实战)
下一篇:Java深入分析讲解反射机制(反射机制 java)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~