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     }

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

  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/alinainai/p/10409540.html
Copyright © 2011-2022 走看看