开发者社区> 程序员大阳> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Java 使用轮询获取线程返回数据

简介: 本文目录 1. 多线程的特点 2. 使用轮询强制等待 3. 轮询的弊端 4. 小结
+关注继续查看

1. 多线程的特点

一般程序中,只有一个主线程,自上而下顺序执行。

但是多线程程序中,多个线程的执行是并发的,程序员无法在设计时预测各个线程的执行结束时间。

看下面的线程类,用来读取文件大小,然后把结果放到线程局部变量中。

/**
* 读取文件大小
*/
public class ReadFileRunnable implements Runnable {
   /**
    * 文件名
    */
   private String fileName;

   public ReadFileRunnable(String fileName) {
    this.fileName = fileName;
   }

   /**
    * 文件大小,默认为-2
    */
   private long length = -2;

   public long getLength() {
    return length;
   }

   @Override
   public void run() {
    File f = new File(fileName);
    if (f.exists() && f.isFile()) {
        this.length = f.length();
    } else {
        this.length = -1;// 文件不存在
    }
   }
}

如果按照一般的思维,我们先启动线程获取文件大小,然后输出文件大小。

    public static void main(String[] args) {
        // 启动线程
        ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
        Thread thread = new Thread(writeFileRunnable);
        thread.start();
        // 输出结果
        System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
    }

运行多次,输出均为-2,这是因为我们启动的线程尚未执行完成,下面输出结果的语句就已经执行了。这是因为我们启动的线程需要读取文件,属于IO操作,速度肯定是比较慢的。

2. 使用轮询强制等待
最简单的解决办法,就是使用轮询,一直检查线程执行的结果。

    public static void main(String[] args) {
        // 启动线程
        ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
        Thread thread = new Thread(writeFileRunnable);
        thread.start();
        // 一直等待
        while (true) {
            if (writeFileRunnable.getLength() == -2) {// 无结果
                continue;
            } else {
                System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
                break;// 直到获取结果结束,此时可以输出文件大小
            }
        }
    }

3. 轮询的弊端
使用轮询,看似解决了问题,但是实际上非常浪费性能。我们测试下:

    public static void main(String[] args) {
        // 启动线程
        ReadFileRunnable writeFileRunnable = new ReadFileRunnable("D:\\temp\\1.txt");
        Thread thread = new Thread(writeFileRunnable);
        thread.start();
        // 一直等待
        int i = 0;
        while (true) {
            i++;
            if (writeFileRunnable.getLength() == -2) {// 无结果
                continue;
            } else {
                System.out.println("循环执行次数:" + i);// 循环执行次数:14365
                System.out.println("length:" + writeFileRunnable.getLength());// 输出-2
                break;// 直到获取结果结束
            }
        }
    }

也就是说,我们检查了一万多次,只有一次是有效的,这不得不说是极大的浪费啊。

4. 小结
多线程程序中,可以使用轮询获取线程返回的数据,但是非常浪费性能,这种方法一般不推荐。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java----线程
线程的介绍
24 0
java线程
java线程
14 0
Java线程
一、创建线程的两种方式 1. 继承Thread类 类 1) 定义子类继承Thread类。 2) 子类中重写Thread类中的run方法。 3) 创建Thread子类对象,即创建了线程对象。
1224 0
java线程池使用
在Java1.5中提供了一个非常高效实用的多线程包:java.util.concurrent,提供了大量高级工具,可以帮助开发者编写高效易维护、结构清晰的Java多线程程序。
833 0
java线程
前言 新的API Atomic variable 一组提供Thread安全操作而不具备synchronizaton的class Thread导论 Thread的创建与管理 数据同步 Thread Notification 极简同步技巧 高级同步议题 ...
634 0
java线程
摘要:分享牛原创,java callable使用,java Runnable使用。java线程池,java线程返回值。 1.1.1. java callable使用 package com.
699 0
java线程
线程的概念: 几乎每种操作系统都支持进程的概念 ----进程就是在某种程度上互相隔离的、独立运行的程序。 进程---程序之间轮询利用CPU时间。 进程是CPU任务。 线程---程序内部,轮询利用程序得到的执行时间。
659 0
+关注
程序员大阳
计算机技术哪家强,中国山东找大阳
593
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载