Maison  >  Article  >  Java  >  Exemples d'utilisation merveilleuse de Future dans le traitement multithread Java

Exemples d'utilisation merveilleuse de Future dans le traitement multithread Java

黄舟
黄舟original
2017-10-12 10:12:281541parcourir

Cet article présente principalement la merveilleuse utilisation de Future dans le traitement multithread Java (code source ci-joint). Les amis qui en ont besoin peuvent s'y référer.

Future en Java est un objet futur, qui stocke les résultats du traitement du thread. C'est comme un bon de livraison. Avec lui, vous pouvez extraire les résultats à tout moment. Dans les deux cas, quitter Future est quasiment impossible. Une situation consiste à diviser la commande. Par exemple, votre application reçoit une commande par lots. À ce stade, si vous avez besoin du traitement le plus rapide de la commande, vous devez la traiter simultanément. Si les résultats simultanés sont collectés, ce problème se posera. très fastidieux si vous le programmez vous-même. Vous pouvez utiliser CompletionService pour résoudre ce problème. CompletionService collecte Future dans une file d'attente et peut entrer dans la file d'attente dans l'ordre dans lequel les résultats sont traités. Une autre situation est que si vous devez interroger quelque chose simultanément (comme un robot d'exploration), tant qu'un résultat de la requête simultanée est renvoyé, vous penserez que la requête a été atteinte et terminerez la requête à ce moment-là. vous devez utiliser CompletionService et Future pour résoudre le problème. Il est plus intuitif de coder directement :


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");
  }
}

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn