码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-06-07 15:48:07      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:写代码   span   except   img   相关   append   ring   trace   分享   

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

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

标签:写代码   span   except   img   相关   append   ring   trace   分享   

原文地址:http://www.cnblogs.com/FlyHeLanMan/p/6956880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!