如何获取线程的返回值?

约定不等于承诺〃 2023-02-20 02:55 243阅读 0赞

获取线程的返回值

  1. 主线程等待法,主线程调用sleep方法(让主线程去循环等待子线程结束并赋值;缺点:代码臃肿,等待时间无法精准控制;不推荐使用);
  2. 使用Thread类的join()阻塞当前线程以等待子线程处理结束(不能精准控制多个线程中的其中一个;不推荐使用);
  3. 通过Callable接口实现call()获取线程返回值(通过FutrueTask Or 线程池获取,推荐使用)

FutrueTask的构造方法可以传入Callable实现类的实例;
isDone()可以判断call是否执行结束;
get()用来获取线程完成后的返回值;

实现

Tips:由于前两种方法都无法精准控制等待时间或者是线程对象,所以对第三种方法进行实现

CallableDemo.java

  1. package Thread;
  2. import java.util.concurrent.Callable;
  3. public class CallableDemo implements Callable<String> {
  4. @Override
  5. public String call() throws Exception {
  6. String res = "Hello";
  7. System.out.println("Call ready");
  8. Thread.currentThread().sleep(5000);
  9. System.out.println("Call down");
  10. return res;
  11. }
  12. }

FutureTaskDemo.java(FutrueTask获取线程返回值)

  1. package Thread;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.FutureTask;
  4. public class FutureTaskDemo {
  5. public static void main(String[] args) throws ExecutionException, InterruptedException {
  6. FutureTask futureTask = new FutureTask(new CallableDemo());
  7. new Thread(futureTask).start();
  8. if (!futureTask.isDone()){
  9. System.out.println("Task is not finshed,Please wait");
  10. }
  11. System.out.println("Return value is "+futureTask.get());
  12. }
  13. }

在这里插入图片描述

ThreadPoolDemo.java(线程池获取线程返回值)

  1. package Thread;
  2. import java.util.concurrent.ExecutionException;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.Future;
  6. public class ThreadPoolDemo {
  7. public static void main(String[] args) {
  8. ExecutorService executorService = Executors.newCachedThreadPool();
  9. Future<String> future= executorService.submit(new CallableDemo());
  10. if (!future.isDone()){
  11. System.out.println("Task is not finshed,Please wait");
  12. }
  13. try {
  14. System.out.println(future.get());
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. } catch (ExecutionException e) {
  18. e.printStackTrace();
  19. }finally {
  20. executorService.shutdown();
  21. }
  22. }
  23. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线返回问题

    > 平时我们写Java程序或者是Android程序的时候有这样一个问题,耗时操作我们需要写到线程里面去,但是一旦写到线程里面去,我们又会发现很难获得返回值,当然天无绝人之路 我

    相关 如何实现处理线返回

            1、主线程等待法         实现起来比较简单,缺点是需要自己实现循环等待的逻辑,当需要等待的变量一多,代码便会显得异常的臃肿,无法做到精准的控制。