首页 > 代码库 > java 多线程 获取线程返回结果

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

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