zoukankan      html  css  js  c++  java
  • 获取Java线程返回值的几种方式

    在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。

    那么怎么获取子线程返回的值呢,我这里总结了三种方式:

    1. 主线程等待。
    2. Join方法等待。
    3. 实现Callable接口。

      Entity类

     1 package com.basic.thread;
     2 
     3 /**
     4  * @author zhangxingrui
     5  * @create 2019-02-17 22:14
     6  **/
     7 public class Entity {
     8 
     9     private String name;
    10 
    11     public String getName() {
    12         return name;
    13     }
    14 
    15     public void setName(String name) {
    16         this.name = name;
    17     }
    18 }

    主线程等待(这个一看代码便知晓,没什么问题)

     1 public static void main(String[] args) throws InterruptedException {
     2         Entity entity = new Entity();
     3         Thread thread = new Thread(new MyRunnable(entity));
     4         thread.start();
     5         // 获取子线程的返回值:主线程等待法
     6         while (entity.getName() == null){
     7             Thread.sleep(1000);
     8         }
     9         System.out.println(entity.getName());
    10     }

      Join方法阻塞当前线程以等待子线程执行完毕

    1 public static void main(String[] args) throws InterruptedException {
    2         Entity entity = new Entity();
    3         Thread thread = new Thread(new MyRunnable(entity));
    4         thread.start();
    5         // 获取子线程的返回值:Thread的join方法来阻塞主线程,直到子线程返回
    6         thread.join();
    7         System.out.println(entity.getName());
    8     }

      通过实现Callable接口

      这里又分为两种情况,通过FutureTask或线程池。

      

      FutureTask

    1 @SuppressWarnings("all")
    2     public static void main(String[] args) throws ExecutionException, InterruptedException {
    3         FutureTask futureTask = new FutureTask(new MyCallable());
    4         Thread thread = new Thread(futureTask);
    5         thread.start();
    6         if(!futureTask.isDone())
    7             System.out.println("task has not finished!");
    8         System.out.println(futureTask.get());
    9     }

      

      线程池

    1 @SuppressWarnings("all")
    2     public static void main(String[] args) throws ExecutionException, InterruptedException {
    3         ExecutorService executorService = Executors.newCachedThreadPool();
    4         Future future = executorService.submit(new MyCallable());
    5         if(!future.isDone())
    6             System.out.println("task has not finished!");
    7         System.out.println(future.get());
    8     }

    书上说,天下没有不散的宴席。不要怕,书上还说了,人生何处不相逢。

  • 相关阅读:
    UVA 1386
    疯狂Android演讲2 环境配置
    七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
    【iOS发展-44】通过案例谈iOS重构:合并、格式化输出、宏观变量、使用数组来存储数据字典,而且使用plist最终的知识
    jQuery选择
    一个月操作总结
    C++易vector
    oracle rac 在完成安装错误。
    NginX issues HTTP 499 error after 60 seconds despite config. (PHP and AWS)
    解决Eclipse中文乱码的方法
  • 原文地址:https://www.cnblogs.com/alinainai/p/10409540.html
Copyright © 2011-2022 走看看