从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪。
一、通过类变量和方法返回数据
使用这种方法返回数据需要在调用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的功能就是使用线程从异步执行变成同步执行。当线程变成同步执行后,就和从普通的方法中得到返回数据没有什么区别了。因此,可以使用如下的代码更有效地解决这个问题:
thread.start();
thread.join();
在thread.join()执行完后,线程thread的run方法已经退出了,也就是说线程thread已经结束了。因此,在thread.join()后面可以放心大胆地使用MyThread类的任何资源来得到返回数据。
二、通过回调函数返回数据
其实这种方法已经在《向线程传递数据的三种方法》中介绍了。在《向线程传递数据的三种方法》一文的例子中通过Work类的process方法向线程中传递了计算结果,但同时,也通过process方法从线程中得到了三个随机数。因此,这种方法既可以向线程中传递数据,也可以从线程中获得数据。
分享到:
相关推荐
本文将深入探讨易语言中线程返回数据的方法,帮助开发者更好地理解和应用。 一、线程基础知识 线程是操作系统分配处理器时间的基本单元。在易语言中,线程可以用来执行一些耗时但不阻塞主线程的操作,如网络通信、...
本文将深入探讨如何在易语言中实现线程返回数据的方法,以及相关的源码解析。 易语言是一种面向对象、中文编程的计算机程序设计语言,其目标是使普通用户也能方便地进行软件开发。在易语言中,我们可以使用“创建...
易语言源码易语言线程返回数据的方法源码.rar 易语言源码易语言线程返回数据的方法源码.rar 易语言源码易语言线程返回数据的方法源码.rar 易语言源码易语言线程返回数据的方法源码.rar 易语言源码易语言线程返回...
总结起来,通过多线程和JDBC的结合,我们可以高效地处理和返回海量数据,避免内存压力和单线程的性能瓶颈。这种技术适用于大数据分析、后台服务或其他需要大量读取数据库的应用场景。在实际操作中,应根据具体的业务...
`BeginInvoke`是异步的,立即返回,操作在UI线程的空闲时间执行。 5. **异步更新UI** 当后台任务完成或有进度需要更新到UI时,可以通过`ReportProgress`方法通知UI线程。`ProgressChanged`事件将在UI线程中触发,...
Java多线程编程中,从线程返回数据是并发编程中的常见需求,通常有以下两种主要方法:通过类成员变量和方法返回数据,以及通过回调函数返回数据。 ### 一、通过类成员变量和方法返回数据 这种方法的核心是利用线程...
创建新线程时,通常会从CWinThread派生一个新的类,并重写其Run()方法,以便在新的线程上下文中执行特定任务。 要实现多线程间的数据传递,我们需要利用Windows的消息机制。在Windows操作系统中,消息队列是线程...
分批取数 多线程数据处理
在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...
与传统的同步开发模式不同,在多线程异步开发模式下,数据的传递和返回方式有很大的区别。因此,本文将介绍三种向线程传递数据的方法。 一、通过构造方法传递数据 在创建线程时,可以通过线程类的构造方法将数据...
3. **分页查询**:分页是一种优化大数据量查询的技术,它将结果集分割成多个小块(页面),每次只返回用户请求的一部分数据。这样不仅可以减轻服务器压力,还能减少网络传输的负担,提高响应速度。 4. **C#线程**:...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
在IT行业中,多线程并行执行是一种常见的优化策略,特别是在处理大数据量或者需要高性能计算的任务时。"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率...
Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...
本教程将深入探讨如何在易语言中实现线程返回数据的方法。 首先,我们需要理解线程的基本概念。线程包含一个执行上下文,包括程序计数器、栈、局部变量等。在易语言中,我们可以通过创建线程对象来启动一个新的执行...
标题提到的“多线程执行完后主程序再执行(包括需要子线程返回结果)”是一个典型的多线程同步问题。在这个场景中,主程序会启动多个子线程去执行不同的任务,然后等待所有子线程执行完毕,最后处理子线程返回的结果...
本示例着重讲解如何利用C#实现基于TCP协议的服务器和客户端通信,特别是在服务器端采用多线程技术处理来自多个客户端的数据。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它...
一个Python多线程爬虫,在工作时,开10个线程来抓取新浪网页的数据,抓取并保存页面, 并且根据deep返回页面链接,根据key确定是否保存该页面,其中: deep == 0时,是抓取的最后一层深度,即只抓取并保存页面,不...