作者:袁冠和堂 | 来源:互联网 | 2023-10-16 17:09
我们在使用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的概念使得多线程编写代码更优雅,后面会介绍到。