• java 多线程 获取线程返回结果


    我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果。

    也就是说,我们需要在一个线程中获取另一个线程的信息。可以分为两种情况,一种是轮询,一种是回调,因为轮询效率很低,所以本文主要介绍回调方法。

    回调的主要思想是:线程run方法执行结束时,主动通知main线程,在main线程中做相应处理。通知main线程可以通过调用main方法中的static方法实现。

    假定以下场景:

    两个线程读取两个不同文件,最后拼接两个文件内容输出。

    1、以下是线程代码:

     1 package com.ccg.test;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.File;
     5 import java.io.FileInputStream;
     6 import java.io.InputStreamReader;
     7 
     8 public class CallbackThread implements Runnable{
     9 
    10     private String fileName;
    11     private TestMain callBack;
    12     
    13     public CallbackThread(TestMain callBack,String fileName) {
    14         this.fileName = fileName;
    15         this.callBack = callBack;
    16     }
    17 
    18     @Override
    19     public void run() {
    20         try {
    21             File file = new File(fileName);
    22             InputStreamReader in = new InputStreamReader(new FileInputStream(file),"gbk");
    23             BufferedReader br = new BufferedReader(in);
    24             String str = br.readLine(); 
    25             //通知线程调用者run方法执行结果
    26             callBack.receiveFileStr(fileName,str);
    27         } catch (Exception e) {
    28             e.printStackTrace();
    29         }
    30     }
    31 }

    可以看到,在run方法结束时回调了线程调用者里面的方法。

    2、线程调用者代码:

     1 package com.ccg.test;
     2 
     3 import org.junit.Test;
     4 
     5 public class TestMain {
     6 
     7     @Test
     8     public void test() throws InterruptedException{
     9         String f1 = "d:\a.txt";
    10         String f2 = "d:\b.txt";
    11         
    12         TestMain t1 = new TestMain();
    13         TestMain t2 = new TestMain();
    14         
    15         CallbackThread cb1 = new CallbackThread(t1, f1);
    16         CallbackThread cb2 = new CallbackThread(t2, f2);
    17         
    18         new Thread(cb1).start();
    19         new Thread(cb2).start();
    20     }
    21     
    22     public void receiveFileStr(String fileName,String readStr){
    23         StringBuffer sb = new StringBuffer();
    24         sb.append(fileName + ":" + readStr);
    25         System.out.println(sb.toString());
    26     }
    27 }

    执行结果如下:

    当然这只是最简单的应用,jdk1.5之后引入了Callable Executor Future的概念使得多线程编写代码更优雅,后面会介绍到。

  • 相关阅读:
    作业一:计算机是如何工作的进行
    信息安全系统设计基础期末总结
    信息安全设计基础系统第十四周学习总结
    信息安全设计基础系统第十三周学习总结
    信息安全系统设计基础_exp3
    信息安全系统设计基础第十二周学习总结
    信息安全系统设计基础第十一周
    信息安全系统设计基础_exp2
    信息安全系统设计基础第十周学习总结
    信息安全系统设计基础_exp1
  • 原文地址:https://www.cnblogs.com/FlyHeLanMan/p/6956880.html
Copyright © 2020-2023  润新知