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的概念使得多线程编写代码更优雅,后面会介绍到。

posted on 2017-06-07 14:42  FlyHeLanMan  阅读(15752)  评论(0编辑  收藏  举报

导航