????????4?????????Actor
????Actor????????????????????????????????????JDK?????actor???????????????????Щ?????actor???
?????????????actor????У??????ж??????????actor?????actor???????????壬???????????????е????????????????actor?????????????????ж???actor??
??????????????????????????actor?????????????????μ?actor???????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????actor??????????????????????????????????????ü?????????????????????????????????????????????
????????????????Akka Actors???????Akka Actors??Java?????????е?JVM Actor?????????????????Scala??????????Scala??????actor??Scala??????????????actor??????JVM??????????actor??????Fantom????Щ?????Actor?????????????????????????????????м???????

static class Message {
String url;
Message(String url) {this.url = url;}
????}
????static class Result {
????String html;
????Result(String html) {this.html = html;}
????}
????static class UrlFetcher extends UntypedActor {
????@Override
????public void onReceive(Object message) throws Exception {
????if (message instanceof Message) {
????Message work = (Message) message;
????String result = WS.url(work.url).get();
????getSender().tell(new Result(result)?? getSelf());
????} else {
????unhandled(message);
????}
????}
????}
????static class Querier extends UntypedActor {
????private String question;
????private List<String> engines;
????private AtomicReference<String> result;
????public Querier(String question?? List<String> engines?? AtomicReference<String> result) {
????this.question = question;
????this.engines = engines;
????this.result = result;
????}
????@Override public void onReceive(Object message) throws Exception {
????if(message instanceof Result) {
????result.compareAndSet(null?? ((Result) message).html);
????getContext().stop(self());
????}
????else {
????for(String base: engines) {
????String url = base + question;
????ActorRef fetcher = this.getContext().actorOf(Props.create(UrlFetcher.class)?? "fetcher-"+base.hashCode());
????Message m = new Message(url);
????fetcher.tell(m?? self());
????}
????}
????}
????}
????private static String getFirstResultActors(String question?? List<String> engines) {
????ActorSystem system = ActorSystem.create("Search");
????AtomicReference<String> result = new AtomicReference<>();
????final ActorRef q = system.actorOf(
????Props.create((UntypedActorFactory) () -> new Querier(question?? engines?? result))?? "master");
????q.tell(new Object()?? ActorRef.noSender());
????while(result.get() == null);
????return result.get();
????}

????Akka actor????????ForkJoin??????????????????????????????????????????????????Message??Result????壬??????????????actor??Querier??????????е????????棬??URLFetcher???????????URL????????????????б???????????????????д?????????Actor????????????????Props??????????????????????actor???????????????????????????????????????????????????????????????????????????
???????Actor???????????????????????????????????????С???????????ó???????????????????ú?????????????в????????????Щ?μ??????????μ????????????
????????????????????
??????????????????????????????????????????????????????????Job?????????????????????????????????????????????
???????????????????????????????ü??????????????Щ???????????????磬д??????Akka??ι??????????Java???????????????????????????顣???????????????μ???????????л????????
???????
?????????????????????????Java??????????е?????????????????????????Java??????????????????????????????????в????executor????ForkJoin????actor????????
???????????????????????????????????????и??????????????????????????????ú?????/??????????????????????