Java 从线程返回数据

来源:互联网 发布:java bigdecimal 编辑:程序博客网 时间:2024/06/16 08:21
从线程中返回数据的两种方法1、通过类变量和类方法返回数据2、通过回调函数返回数据3、实现 Callable<V>接口,其中 V 代表 返回值类型

一、通过变量和方法返回数据

先看如下一段代码

public class MyThread extends Thread {    private String value1;    private String value2;    public void run()    {        value1 = "value1";        value2 = "value2";    }    public static void main(String[] args)     {         MyThread t1 = new MyThread();         t1.start();         System.out.println(t1.value1);         System.out.println(t1.value2);    }}

输出结果 :

nullnull

上面的运行结果很不正常,在run方法中已经对value1和value2进行赋值,但是返回却是null。发生这种情况的原因是: 在调用strat()方法后就立即输出 value1 和 value2 的值,而这里的run 方法 还没有指定到value1 和 value2 赋值语句。

如果要避免这种情况,就需要等run方法执行完成后才输出 vaue1 和value2 代码。可以考虑使用sleep 将主线程进行延迟,但是有一个问题,你不知道需要延迟多久才能知道 value2 或 value1 有值 !!! 我们可以这样做,如下代码

public class MyThread extends Thread {       private String value1;    private String value2;    public void run()    {        value1 = "value1";        value2 = "value2";    }    public static void main(String[] args) throws InterruptedException     {         MyThread t1 = new MyThread();         t1.start();         while(t1.value1 == null || t1.value1 == null)         {             sleep(100);         }         System.out.println(t1.value1);         System.out.println(t1.value2);    }}

输出结果:

value1value2

以上方法虽然帮助我们解决了问题,但是Java的线程模型为我们提供了更好的解决方案,就是使用join()方法,join()方法的功能 就是使线程 从异步执行 变成同步执行 。当线程变成同步执行后,就跟普通方法中得到返回数据没什么区别了。

    public static void main(String[] args) throws InterruptedException     {         MyThread t1 = new MyThread();         t1.start();         t1.join();         System.out.println(t1.value1);         System.out.println(t1.value2);    }

二、通过回调函数返回数据

跟 通过回调方法向线程传递 数据的 思路一致

三、实现 Callable 接口

1、定义任意类并实现 Callable 接口,并实现 方法 V call() throws Exception。其中,v 皆是代表返回值类型

2、在 V call() throws Exception 方法里 定义 方法体,并 return 一个返回值

3、创建线程池,创建任务对象,线程池通过submit(任务对象) 执行任务,并返回一个 Future<V> 对象

4、通过Future对象.get() 方法获取返回值

5、关闭线程池,释放资源

public class MyThread implements Callable<String> {    private String value;    public MyThread(String value)    {        this.value = value;    }    public String call() throws Exception    {        System.out.println(Thread.currentThread().getName());//pool-1-thread-1        return "线程返回值是:"+this.value;    }    public static void main(String[] args)     {        //创建一个线程池对象        ExecutorService pool = Executors.newCachedThreadPool();        //创建一个有返回值的任务        MyThread task = new MyThread("Java");        //执行任务并获取Future对象        Future<String> future  = pool.submit(task);        //从 Future 对象 获取任务返回值        while(true)        {            //可以用isDone()方法来查询Future是否已经完成,任务完成后,可以调用get()方法来获取结果            //注意: 如果不加判断直接调用get方法,此时如果线程未完成,get将阻塞,直至结果准备就绪            if(future.isDone())            {                try                {                    String returnValue = future.get().toString();                    System.out.println("线程返回值:"+returnValue);                }catch (Exception e){                    e.printStackTrace();                }                //关闭线程池                pool.shutdown();                //跳出循环                break;            }        }    }}
阅读全文
0 0
原创粉丝点击