我们在使用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的概念使得多线程编写代码更优雅,后面会介绍到。
时间: 2024-10-18 09:46:11