首页 > 代码库 > 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 多线程 获取线程返回结果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。