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     }

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

  • 相关阅读:
    存储过程中Like没有数据?
    鼠标放上图片移动,字体移动
    Excel
    参数无效。区域性ID2155(0X086B)不是受支持的区域性
    JVM指令集及各指令的详细使用说明[转的]
    BTrace使用简介
    ST表
    树剖模板
    AjaxControlToolkit中的CalendarExtender被遮挡及日期格式本地化解决方法
    Using Beyond Compare with TFS
  • 原文地址:https://www.cnblogs.com/alinainai/p/10409540.html
Copyright © 2011-2022 走看看