如何实现处理线程的返回值

方法有以下几种:

主线程等待法

使用Thread类的join()阻塞当前线程以等待子线程处理完毕

通过Callable接口实现: 通过FutureTask Or线程池获取

一、主线程等待法

如下代码

public class CycleWait implements  Runnable {

    private String name;

    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        name = "zhang san";
    }

    public static void main(String[] args) {
        CycleWait cw = new CycleWait();
        Thread t = new Thread(cw);
        t.start();
        System.out.println("name: " + cw.name);
    }
}

  打印的结果为

将它改造成主线程等待法

public class CycleWait implements  Runnable {

    private String name;

    @Override
    public void run() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        name = "zhang san";
    }

    public static void main(String[] args) throws InterruptedException {
        CycleWait cw = new CycleWait();
        Thread t = new Thread(cw);
        t.start();
        while (cw.name == null){
            Thread.sleep(100);
        }
        System.out.println("name: " + cw.name);
    }
}

  这样,5秒后就能打印name的值

二、使用Thread类的join()阻塞当前线程以等待子线程处理完毕

修改上上面的方法

三、通过Callable接口实现: 通过FutureTask Or线程池获取

1、通过FutureTask

创建MyCallback 类,实现Callable接口

public class MyCallback implements Callable<String>{

    @Override
    public String call() throws Exception {
        String value = "nick";
        System.out.println("Read to work");
        Thread.sleep(5000);
        System.out.println("task done");
        return value;
    }
}

  使用FutureTask的方式

public class FutureTaskDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> task = new FutureTask<String>(new MyCallback());
        new Thread(task).start();

        if(!task.isDone()){
            System.out.println("任务没有完成,请等待");
        }
        System.out.println("任务返回:" + task.get());

    }

}

  打印结果

任务没有完成,请等待
Read to work
task done
任务返回:nick

  

2、使用线程池的方式

public class SomeCallable {

    public static void main(String[] args)  {
        Callable<String> callbale = new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "ok";
            }
        };

        ExecutorService executorService = Executors.newFixedThreadPool(2);
        //执行任务并获取Future对象
        Future<String> future = executorService.submit(callbale);

        try {
            String result =  future.get();
            System.out.println("result:" + result);
        }catch (Exception e){}
        finally {
            //关闭线程池
            executorService.shutdown();
        }

    }
}

  

原文地址:https://www.cnblogs.com/linlf03/p/12112790.html

时间: 2024-10-07 15:51:26

如何实现处理线程的返回值的相关文章

在Java 线程中返回值的用法

http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread 有时在执行线程中需要在线程中返回一个值:常规中我们会用Runnable接口和Thread类设置一个变量:在run()中改变变量的值,再用一个get方法取得该值,但是run何时完成是未知的:我们需要一定的机制来保证. 在在Java se5有个Callable接口:我们可以用该接口来完成该功能: 代码如: Java代码   package com.thr

线程的返回值

线程的返回值当线程退出时,线程可以选择向主线程返回一个值,返回方式一共有4种1\如果要返回int类型,可以使用pthread_exit((int)* return_value);2\使用全局变量返回(这个最简单)3\使用malloc所分配的空间4\直接返回字符串,如pthread_exit("return value"); #include <stdio.h> #include <stdlib.h> #include <string.h> #incl

python多线程获取子线程任务返回值

今天想实现多线程更新资产信息,所以使用到了threading,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 def auto_asset(node): ret = salt.remote_grains_execution_sigle(node) asset_info={} asset_info['os']= ret[node]['oscodename'] asset_info['kernelrelease']= ret[node]['kernelrel

Java多线程——&lt;三&gt;让线程有返回值

一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时该怎么办呢? 答案是使用Callable.之前定义的任务都直接实现了Runnable,该接口的run方法并无返回值.而Callable的call方法可以根据你传入的泛型参数返回对应类型的数据. 二.实现 1.实现Callable接口,定义可返回结果的线程任务 public class TaskCal

线程待返回值等问题

问题一,线程的基本操作,例如:暂停.继续.停止等 我不建议使用Thread类提供的Suspend.Resume以及Abort这三个方法,前两个有问题,好像在VS05已经屏蔽这两个方法:对于Abort来说,除了资源没有得到及时释放外,有时候会出现异常.如何做呢,通过设置开关变量来完成 问题二,如何向线程传递参数或者从中得到其返回值: 我不建议使用静态成员来完成,仅仅为了线程而破坏类的封装有些得不偿失.那如何做呢,通过创建单独的线程类来完成 //委托 public delegate double w

java线程池的自带监控,线程池返回值的控制

当使用java线程池的时候,返回值类型用future<T> 来接收,比如: Future<String> future = fixedThreadPool.submit(new Thread());返回的结果必须由线程执行完毕后才会返回,我们可以利用这一点进行线程堵塞,监控线程的结束时间. package com.test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.

Java多线程——&lt;四&gt;让线程有返回值

一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时该怎么办呢? 答案是使用Callable.之前定义的任务都直接实现了Runnable,该接口的run方法并无返回值.而Callable的call方法可以根据你传入的泛型参数返回对应类型的数据. 二.实现 1.实现Callable接口,定义可返回结果的线程任务 public class TaskCal

Java线程池,获取返回值

程序中使用的是Callable接口,可以获取线程的返回值. package liuzh; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.Lin

java线程返回值讨论

java线程返回值讨论在线程当中,返回值是个很大的问题.比如:在线程执行到某一步的时候要将数据返回,在程序执行完成后要返回值.在java中,线程的返回值可以使用Future<T>来获取,也可以使用其他的手段.以下讨论一些返回值的一些小手段:1.使用静态变量来进行值的返回使用静态变量来进行值的返回是最简单的一种,也是不可取的一种,这种不仅带来线程的安全性,同时内存一直不能释放,直到系统退出才能释放内存,因此会造成内存花费很多,但是真正在使用的很少.2.使用Futuren<T>来获取这