搜索
首页 电脑/网络 软件 系统软件

如何从线程返回数据?

如何从线程返回数据?

全部回答

2017-07-26

46 0
    从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪。 一、通过类变量和方法返回数据 使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据。
  让我们先来看看例程2-13会得到什么结果。   1。package mythread; 2。 3。public class MyThread extends Thread 4。
  { 5。 private String value1; 6。 private String value2; 7。 8。 public void run() 9。   { 10。
   value1 = "通过成员变量返回数据"; 11。 value2 = "通过成员方法返回数据"; 12。 } 13。 public static void main(String[] args) throws Exception 14。
   { 15。   MyThread thread = new MyThread(); 16。 thread。start(); 17。 System。out。println("value1:" + thread。
  value1); 18。 System。out。println("value2:" + thread。  value2); 19。 } 20。} 运行上面的代码有可能输出如下的结果: value1:null value2:null 从上面的运行结果看很不正常。
  在run方法中已经对value1和value2赋了值,而返回的却是null。发生这种情况的原因是调用 start方法后就立刻输出了value1和value2的值,而这里run方法还没有执行到为value1和value2赋值的语句。
    要避免这种情况的发生,就需要等run方法执行完后才执行输出value1和value2的代码。因此,我们可以想到使用sleep方法将主线程进行延迟,如可以在 thread。
  start()后加一行如下的语句: sleep(1000); 这样做可以使主线程延迟1秒后再往下执行,但这样做有一个问题,就是我们怎么知道要延迟多长时间。  在这个例子的run方法中只有两条赋值语句,而且只创建了一个线程,因此,延迟1秒已经足够,但如果run方法中的语句很复杂,这个时间就很难预测,因此,这种方法并不稳定。
   我们的目的就是得到value1和value2的值,因此,只要判断value1和value2是否为null。  如果它们都不为null时,就可以输出这两个值了。我们可以使用如下的代码来达到这个目的: 21。
  while (thread。value1 == null || thread。value2 == null); 使用上面的语句可以很稳定地避免这种情况发生,但这种方法太耗费系统资源。  大家可以设想,如果run方法中的代码很复杂,value1和 value2需要很长时间才能被赋值,这样while循环就必须一直执行下去,直到value1和value2都不为空为止。
  因此,我们可以对上面的语句做如下的改进: 22。while (thread。value1 == null || thread。  value2 == null) 23。 sleep(100); 在while循环中第判断一次value1和value2的值后休眠100毫秒,然后再判断这两个值。
  这样所占用的系统资源会小一些。 上面的方法虽然可以很好地解决,但Java的线程模型为我们提供了更好的解决方案,这就是join方法。  在前面已经讨论过,join的功能就是使用线程从异步执行变成同步执行。
  

类似问题换一批

热点推荐

热度TOP

相关推荐
加载中...

热点搜索 换一换

电脑/网络
系统软件
硬件
电脑装机
程序设计
互联网
操作系统/系统故障
笔记本电脑
反病毒
百度
软件
软件
系统软件
多媒体软件
办公软件
网络软件
图像处理软件
系统软件
系统软件
举报
举报原因(必选):
取消确定举报