线程是异步的,如何获取线程的返回结果?可通过join方法
定义一个接口:
package thread;
import java.util.List;
public interface FightQuery {
List<String> get();
}
接口实现类:
package thread;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class FightQueryTask extends Thread implements FightQuery {
private final String origin;
private final String destination;
private final List<String> flightList = new ArrayList<String>();
public FightQueryTask(String airline, String origin, String destination) {
super("[" + airline + "]");
this.origin = origin;
this.destination = destination;
}
@Override
public void run() {
System.out.printf("%s-query form %s to %s \n", getName(), origin, destination);
Random random = new Random();
int randomVal = random.nextInt(10);
try {
TimeUnit.SECONDS.sleep(randomVal);
this.flightList.add(getName() + "-" + randomVal);
System.out.printf("The Fight:%s list query successful \n", getName());
} catch (Exception e) {
}
}
public List<String> get() {
return this.flightList;
}
}
使用示例:
package thread;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class FightQueryExample {
private static List<String> fightCompany = Arrays.asList("CSA", "CEA", "HNA");
public static void main(String[] args) {
List<String> results = search("SH", "BJ");
System.out.println("=========result=========");
for (String s : results) {
System.out.println(s);
}
System.out.println("=========result=========");
}
private static List<String> search(final String original, final String dest) {
final List<String> result = new ArrayList<String>();
List<FightQueryTask> tasks = new ArrayList<FightQueryTask>();
for (String company : fightCompany) {
FightQueryTask f = createSearchTask(company, original, dest);
tasks.add(f);
f.start();
}
for (FightQueryTask task : tasks) {
try {
task.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (FightQueryTask task : tasks) {
result.addAll(task.get());
}
return result;
}
private static FightQueryTask createSearchTask(String fight, String original, String dest) {
return new FightQueryTask(fight, original, dest);
}
}