>  기사  >  Java  >  Java 다중 스레드 처리에서 Future를 훌륭하게 사용한 예

Java 다중 스레드 처리에서 Future를 훌륭하게 사용한 예

黄舟
黄舟원래의
2017-10-12 10:12:281602검색

이 글은 주로 Java 멀티스레딩 처리에서 Future의 마법같은 활용법을 소개합니다(소스 코드 첨부). 필요하신 분들은 참고하시면 좋습니다.

Java의 Future는 이 스레드의 처리 결과를 저장하는 future 객체입니다. 이를 통해 언제든지 결과를 추출할 수 있습니다. 두 경우 모두 Future를 떠나는 것은 거의 불가능합니다. 한 가지 상황은 주문을 분할하는 것입니다. 예를 들어 애플리케이션이 일괄 주문을 받는 경우, 이때 가장 빠른 주문 처리가 필요한 경우 동시에 처리해야 하는 경우 이러한 문제가 발생합니다. 직접 프로그래밍하면 매우 번거롭습니다. CompletionService를 사용하면 이 문제를 해결할 수 있습니다. CompletionService는 Future를 큐에 모아 결과 처리가 완료된 순서대로 큐에 들어갈 수 있다. 또 다른 상황은 크롤러 등 무언가를 동시에 쿼리해야 하는 경우, 동시 쿼리의 결과 중 하나가 반환되기만 하면 해당 쿼리에 도달했다고 생각하고 이때 쿼리도 종료하게 됩니다. 문제를 해결하려면 CompletionService와 Future를 사용해야 합니다. 직접 코딩하는 것이 더 직관적입니다.


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

Summary

위 내용은 Java 다중 스레드 처리에서 Future를 훌륭하게 사용한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.