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; } } }}
- Java 从线程返回数据
- Java多线程---从线程中返回数据
- Java 从线程返回信息
- Java网络编程:从线程返回信息。
- Java多线程初学者指南(8):从线程返回数据的两种方法
- Java多线程初学者指南(8):从线程返回数据的两种方法
- Java多线程初学者指南(8):从线程返回数据的两种方法
- Java多线程初学者指南(8):从线程返回数据的两种方法
- 初学Java多线程:从线程返回数据的两种方法
- 初学Java多线程:从线程返回数据的两种方法
- 八、初学Java多线程:从线程返回数据的两种方法
- 初学Java多线程:从线程返回数据的两种方法
- 读书笔记-java网络编程-3线程-从线程返回信息
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 从线程返回数据的两种方法
- 2017年你不能错过的Java类库
- Android图片加载框架比较与使用
- 关闭 Microsoft Word 2010 配置窗口
- oracle数据库<导入,导出>linux系统
- Hive中自带Funcion以及UDF编程
- Java 从线程返回数据
- Linux CPU实时监控mpstat命令详解
- week2作业题
- Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法
- Python subprocess、configparser、yaml模块
- kafka数据可靠性深度解读
- 欢迎使用CSDN-markdown编辑器
- u-boot移植(十二)---代码修改---支持DM9000网卡
- 【Scikit-Learn 中文文档】随机投影