《Java 高并发编程详解》第三章 join实践,里面使用的是java8的lamda表达式,特编写案例学习该方法。
背景:并发查询各大航空公司的航班信息,全部返回后整理成规定格式显示在界面上。
重点:并发查询
代码如下:
//查询接口
public interface FlightQuery {
List<String> get();
}
public class FlightQueryThread extends Thread implements FlightQuery {
private String origin;
private String destination;
private List<String> flightList = new ArrayList<>();
public FlightQueryThread(String origin, String destination, String airline) {
super("[" + airline + "]");
this.origin = origin;
this.destination = destination;
}
@Override
public void run() {
super.run();
System.out.printf("%s-query from %s to %s \n", getName(), origin, destination);
//随机值表示查询返回时间
int randomVal = ThreadLocalRandom.current().nextInt(10);
try {
TimeUnit.SECONDS.sleep(randomVal);
this.flightList.add(getName() + randomVal);
System.out.printf("The flight is %s,query successFul. \n", getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public List<String> get() {
return this.flightList;
}
}
public class Main {
private static List<String> flightCompany = Arrays.asList("China", "USA", "Russia");
public static void main(String[] args) {
List<String> result = search("SH", "BJ");
System.out.println("--result--");
result.forEach(System.out::println);
}
private static List<String> search(String original, String dest) {
List<String> result = new ArrayList<>();
//java8 可同等替换下方注释代码,创建线程列表
List<FlightQueryThread> taskList = flightCompany.stream().map(f -> createSearchThread(f, original, dest)).collect(Collectors.toList());
// List<FlightQueryThread> taskList = new ArrayList<>();
// for (String flight : flightCompany) {
// FlightQueryThread thread = createSearchThread(flight, original, dest);
// thread.start();
// taskList.add(thread);
// };
taskList.forEach(Thread::start);
taskList.forEach(t -> {
try {
//分别join用来阻塞主线程
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
//所有线程均返回,获取每一个的查询结果
taskList.stream().map(FlightQueryThread::get).forEach(result::addAll);
return result;
}
private static FlightQueryThread createSearchThread(String flight, String original, String dest) {
return new FlightQueryThread(original, dest, flight);
}
}