通过类变量和方法返回数据

news/2024/7/7 22:21:41

 使用这种方法返回数据需要在调用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类的任何资源来得到返回数据。


http://lihuaxi.xjx100.cn/news/1490267.html

相关文章

40分钟的录课如何压缩为1GB?分享视频压缩方法

现在视频清晰度都很高,因此录制的视频大小也都超过了1GB,给我们的传输、存储带来了不便,如果想要将录制的课程压缩变小,可以通过视频压缩软件直接压缩、视频编辑软件调整分辨率等方式进行解决,下面就来看下具体的方法吧…

python用 xlwings库对Excel进行 字体、边框设置、合并单元格, 版本转换等操作

xlwings 其他的一些单元格读取写入操作网上很多, 下面就写些如何设置单元格的 字体对齐,字体大小、边框, 合并单元格, 这些设置。 import xlwings as xwapp = xw.App(visible=True, add_book=False) app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。…

面试题-React(七):React组件通信

在React开发中,组件通信是一个核心概念,它使得不同组件能够协同工作,实现更复杂的交互和数据传递。常见的组件通信方式:父传子和子传父 一、父传子通信方式 父组件向子组件传递数据是React中最常见的一种通信方式。这种方式适用…

day17 代码回想录 二叉树04 平衡二叉树二叉树的所有路径左叶子之和

大纲 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 平衡二叉树 题目链接:110.平衡二叉树 分析过程: 本题的解题思路是求最大深度和最短路径元素个数后,判断两者差是否小于1 // 二叉树是否平衡 void minMaxDepth(TreeN…

【MySQL】3、MySQL的索引、事务、存储引擎

create table class (id int not null,name char(10),score decimal(5,2)); insert into class values (1,zhangsan,80.5); update class set namewangwu,passwd123 where id2; select * from class where id2; drop 索引的概念 是一种帮助系统,能够更快速的查询信…

官方项目《内容示例》中Common UI部分笔记: 1.1 Activatable Widgets

本文主要面向UMG以及Common UI的初学者 文章目录 效果展示概要Activate和Deactivate可见性绑定UI动画设置Common Activatable Widget的默认焦点 效果展示 概要 这个例子非常简单,定义了13个Common Activatable Widget CommonUI_ActivatableWidgets相当于一个容器包…

Web弹性布局

/*弹性盒子 弹性布局 */ /* 默认从左到右 */ display: flex; /* 从右到左 */ /* flex-direction: row-reverse; */ /* 从上到下 */ /* flex-direction: column; */ …

Stone Prover:StarkWare的STARK Prover

1. 引言 StarkWare将基于Apache 2.0 license,开源其以C编写的STARK Prover,名为Stone(STARK one)。 其基本流程为: 1)编写Cairo0程序。2)使用Cairo工具 将Cairo0程序编译为CASM。3&#xff…