Heim  >  Artikel  >  Java  >  Beispiele für die wunderbare Verwendung von Future in der Java-Multithread-Verarbeitung

Beispiele für die wunderbare Verwendung von Future in der Java-Multithread-Verarbeitung

黄舟
黄舟Original
2017-10-12 10:12:281602Durchsuche

Dieser Artikel stellt hauptsächlich die wunderbare Verwendung von Future in der Java-Multithreading-Verarbeitung vor (Quellcode im Anhang). Freunde, die ihn benötigen, können darauf verweisen.

Future ist in Java ein zukünftiges Objekt, das die Ergebnisse der Thread-Verarbeitung speichert. Es ist wie ein Lieferschein. Damit können Sie die Ergebnisse jederzeit extrahieren. In beiden Fällen ist es nahezu unmöglich, Future zu verlassen. Eine Situation besteht darin, die Bestellung aufzuteilen. Wenn Sie zu diesem Zeitpunkt die schnellste Verarbeitung der Bestellung benötigen, tritt dieses Problem auf Sehr umständlich, wenn Sie es selbst programmieren. Sie können CompletionService verwenden, um dieses Problem zu lösen. CompletionService sammelt Future in einer Warteschlange und kann in der Reihenfolge, in der die Ergebnisverarbeitung abgeschlossen ist, in die Warteschlange eintreten. Eine andere Situation besteht darin, dass Sie, wenn Sie etwas gleichzeitig abfragen müssen (z. B. einen Crawler), denken, dass die Abfrage erreicht wurde, und die Abfrage zu diesem Zeitpunkt beenden, solange ein Ergebnis der gleichzeitigen Abfrage zurückgegeben wird Sie müssen CompletionService und Future verwenden, um das Problem zu lösen. Es ist intuitiver, direkt zu codieren:


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CompletionServiceTest {
  static int numThread =100;
  static ExecutorService executor = Executors.newFixedThreadPool(numThread);
  public static void main(String[] args) throws Exception{
    //data表示批量任务
    int[] data =new int[100];
    for(int i=1;i<100000;i++){
      int idx =i % 100;
      data[idx] =i;
      if(i%100==0){
        testCompletionService(data);
        data =new int[100];
      }
    }
  }
  private static void testCompletionService(int [] data) throws Exception{    
    CompletionService<Object> ecs = new ExecutorCompletionService<Object>(executor);
    for(int i=0;i<data.length;i++){
      final Integer t=data[i];
      ecs.submit(new Callable<Object>() {
        public Object call() {
          try {
            Thread.sleep(new Random().nextInt(1000));
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          return t;
        }
      });
    }
    //CompletionService会按处理完后顺序返回结果
    List<Object> res =new ArrayList<Object>();
    for(int i = 0;i<data.length;i++ ){
      Future<Object> f = ecs.take();
      res.add(f.get());
    }       
    System.out.println(Thread.currentThread().getName()+":"+res);
  }
  private static void testBasicFuture(int [] data) throws Exception{   
    List<Future<Object>> res =new ArrayList<Future<Object>>();
    for(int i=0;i<data.length;i++){
      final Integer t=data[i];
      Future<Object> future=executor.submit(new Callable<Object>() {
        public Object call() {
          return t;
        }
      });
      res.add(future);
    }   
    for(int i = 0;i<res.size();i++ ){
      Future<Object> f = res.get(i);
      Object rObject =f.get();
      System.out.print(":"+rObject);
    }       
    System.out.println("LN");
  }
}

Zusammenfassung

Das obige ist der detaillierte Inhalt vonBeispiele für die wunderbare Verwendung von Future in der Java-Multithread-Verarbeitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn