从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪。
一、通过类变量和方法返回数据
使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据。让我们先来看看例程2-13会得到什么结果。
package mythread;
public class MyThread extends Thread
{
private String value1;
private String value2;
public void run()
{
value1 = "通过成员变量返回数据";
value2 = "通过成员方法返回数据";
}
public static void main(String[] args) throws Exception
{
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
运行上面的代码有可能输出如下的结果:
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时,就可以输出这两个值了。我们可以使用如下的代码来达到这个目的:
while (thread.value1 == null || thread.value2 == null);
使用上面的语句可以很稳定地避免这种情况发生,但这种方法太耗费系统资源。大家可以设想,如果run方法中的代码很复杂,value1和value2需要很长时间才能被赋值,这样while循环就必须一直执行下去,直到value1和value2都不为空为止。因此,我们可以对上面的语句做如下的改进:
while (thread.value1 == null || thread.value2 == null)
sleep(100);
在while循环中第判断一次value1和value2的值后休眠100毫秒,然后再判断这两个值。这样所占用的系统资源会小一些。
上面的方法虽然可以很好地解决,但Java的线程模型为我们提供了更好的解决方案,这就是join方法。在前面已经讨论过,join的功能就是使用线程从异步执行变成同步执行。当线程变成同步执行后,就和从普通的方法中得到返回数据没有什么区别了。因此,可以使用如下的代码更有效地解决这个问题:
thread.start();
thread.join();
在thread.join()执行完后,线程thread的run方法已经退出了,也就是说线程thread已经结束了。因此,在thread.join()后面可以放心大胆地使用MyThread类的任何资源来得到返回数据。
二、通过回调函数返回数据
其实这种方法已经在《向线程传递数据的三种方法》中介绍了。在《向线程传递数据的三种方法》一文的例子中通过Work类的process方法向线程中传递了计算结果,但同时,也通过process方法从线程中得到了三个随机数。因此,这种方法既可以向线程中传递数据,也可以从线程中获得数据。
分享到:
相关推荐
Java 多线程初学者指南之向线程传递数据的三种方法 在多线程编程中,向线程传递数据是一项非常重要的任务。与传统的同步开发模式不同,在多线程异步开发模式下,数据的传递和返回方式有很大的区别。因此,本文将...
Java多线程初学者指南是一份详尽的教育资源,涵盖了多线程编程的基本概念和实践技巧,适合初学者深入理解这一重要技术。本指南通过12篇文档,逐步引导学习者掌握Java多线程的核心知识。 首先,让我们从基础开始,...
本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...
4. **死锁**:当两个或更多线程相互等待对方释放资源而形成的一种僵局。了解死锁的四个必要条件(互斥、占有并等待、无抢占、循环等待)和避免死锁的策略。 5. **线程优先级**:不同的线程可能有不同的优先级,...
总之,《Java多线程设计模式详解》是一本全面且实用的指南,无论你是Java初学者还是经验丰富的开发者,都能从中受益,提升你的多线程编程技巧。通过学习这本书,你可以更好地驾驭Java的多线程世界,编写出高效、稳定...
这篇总结将深入探讨Java多线程的基础概念、特性以及常见用法,旨在为初学者提供一个全面的学习指南。 一、线程的基本概念 在Java中,线程是程序执行的最小单位,每个线程都有自己的程序计数器、虚拟机栈、本地方法...
本指南将深入探讨Java线程的基本概念、创建方式以及管理策略,旨在帮助初学者快速掌握线程的工作原理。 一、Java线程基础知识 在Java中,线程是程序中的单一顺序控制流程。一个进程可以包含多个线程,每个线程都有...
本资源包针对初学者提供了全面的多线程学习资料,旨在帮助你快速入门并解决实际开发中的问题。 首先,线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。多线程编程能够提高程序的并发性和执行...
《Java多线程编程》第三版是一本深入探讨Java并发编程的权威指南,旨在帮助开发者理解和掌握Java平台上的多线程技术。这本书详尽地介绍了如何有效地利用多核处理器的性能,以及如何在复杂的并发环境中设计和实现高效...
本资料“java-Thread-study-summary.zip”提供了一个深入学习Java多线程的综合指南,特别适合初学者进行实践操作。 1. **线程的创建** - 继承`Thread`类:创建一个新的类,该类继承自`Thread`,然后重写`run()`...
本资源“多线程编程指南”提供了中文和英文两种版本,由SUN公司提供,是理解并掌握多线程技术的一个宝贵资料。 多线程是指在一个进程中同时执行多个线程(执行流)。这种技术可以显著提升程序的效率,因为它允许...
"java初学者教程初学者下载看看"这个标题暗示了这是一个专门为Java新手设计的学习资源,旨在帮助他们从零开始了解和学习Java编程。 "Java初学者教程:使用初学者,从不懂倒懂健康成长"的描述,表达了这个教程的目标...
总之,"java初学者的PPT"是一份全面的入门指南,覆盖了从基础到进阶的Java知识,对于想要踏入编程世界的初学者来说,无疑是一份宝贵的资源。通过深入学习和实践,你将能够逐步掌握Java编程,为未来的开发工作打下...
学习《多线程编程指南》这样的入门资料,可以帮助初学者逐步理解并掌握这些概念和技巧。通过实践,你可以编写出更加高效、健壮的多线程应用程序,解决那些难以调试的问题,为你的编程生涯添砖加瓦。在实际工作中,...
《Java学习指南上册》是一本专为Java初学者和进阶者设计的教程书籍,旨在帮助读者深入理解和掌握Java编程语言。这份压缩包包含了该书的上下两部分,分别为"Java学习指南第四版上册part1.pdf"和"Java学习指南第四版...
6. **多线程**:Java内置了对多线程的支持,Thread类和Runnable接口是创建线程的两种方式。理解线程同步和互斥的概念,以及synchronized关键字、wait()、notify()方法的使用,对于编写并发程序至关重要。 7. **网络...
这个压缩包包含了一份名为"java初学者实践.CHM"的文件,这通常是一个帮助文档,可能包含了详细的教程、示例代码和学习指南。 在Java初学者的旅程中,以下是一些关键知识点: 1. **基础概念**:Java是一种面向对象...
《详细JAVA线程第三版》是一本专注于Java线程编程的深度指南,旨在帮助开发者深入理解和熟练运用Java平台上的多线程技术。本书全面覆盖了Java线程的基础知识、高级特性以及最佳实践,旨在提升读者在并发编程领域的...
"Java创建线程的两个方法.doc" 可能讲解了通过继承Thread类和实现Runnable接口这两种方式来创建线程的区别和适用场景。通常,推荐使用实现Runnable接口的方式,因为这样可以避免类的单继承限制。 "想成为Java高手的...
- **并发支持**:Scala内置了对并发编程的支持,通过Actors模型和其他高级抽象简化了多线程编程的复杂度。 #### 四、为什么学习Scala? 1. **并发处理**:随着多核处理器的普及,传统的同步编程模型越来越难以满足...