2012-03-13 1 views
2

저는 Java를 배우고 있으며 기존 응용 프로그램에서 runnable을 사용하여 멀티 스레딩을 할 수있었습니다. 나는 현재 스레드 (thread간에 변수를 공유하기 위해)를 혼란시키는 사람을보고 있었지만, 저자가 실제로 스레드를 생성하는 방법을 알 수는 없다.이 Java 응용 프로그램은 스레드를 확장하거나 실행 가능을 구현하지 않고 여러 스레드를 어떻게 실행합니까?

나는 그가 내 프로그램에서 실행 가능한 클래스를 제출하는 데 사용하는 Executor를 사용하고 있지만이 예제에서는 제출 (또는 실행)이 없다고 본다. 나는 오라클 튜토리얼에서 알 수있는 것을 배웠고 스레드를 확장하거나 실행 가능한 도구를 구현하는 것이 두 가지 방법 밖에 없다고 언급했다. (나는 여기도 보지 못하지만 집행자를 방해자에게 제출한다. 나는 뭔가를 놓치고 있는가? 아니면이 사람이 다른 방식으로 그것을하고 있는가? 내 최종 목표는이 코드를 이해하는 것입니다 (완벽하게 작동합니다). 그래서 그것을 기존의 (실행 가능을 사용하여) 코드에 적용 할 수 있습니다.

App.java

import com.lmax.disruptor.*; 
import com.lmax.disruptor.dsl.*; 

import java.util.concurrent.Executor; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ThreadPoolExecutor; 

public class App { 

    private final static int RING_SIZE = 1024 * 8; 

    private static long handleCount = 0; 

    private final static long ITERATIONS = 1000L * 1000L * 300L; 
    private final static int NUM_EVENT_PROCESSORS = 8; 

    private final static EventHandler<ValueEvent> handler = 
     new EventHandler<ValueEvent>() { 
     public void onEvent(final ValueEvent event, 
           final long sequence, 
           final boolean endOfBatch) throws Exception { 
     handleCount++; 
    } 
    }; 

    public static void main(String[] args) { 
    System.out.println("Starting disruptor app."); 

    ExecutorService executor = Executors.newFixedThreadPool(NUM_EVENT_PROCESSORS); 

    Disruptor<ValueEvent> disruptor = 
     new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY, executor, 
      new SingleThreadedClaimStrategy(RING_SIZE), 
      new SleepingWaitStrategy()); 
    disruptor.handleEventsWith(handler); 
    RingBuffer<ValueEvent> ringBuffer = disruptor.start(); 

    long start = System.currentTimeMillis(); 

     long sequence; 
     ValueEvent event; 
    for (long x=0; x<ITERATIONS; x++) { 
     sequence = ringBuffer.next(); 
     event = ringBuffer.get(sequence); 
     event.setValue(x); 
     ringBuffer.publish(sequence); 
     } 
    final long expectedSequence = ringBuffer.getCursor(); 

    while (handleCount < expectedSequence) { } 

    long opsPerSecond = (ITERATIONS * 1000L)/(System.currentTimeMillis() - start); 
    System.out.printf("op/s: %d, handled: %d", opsPerSecond, handleCount); 
    } 
} 

업데이트 :

여기에 문제의 코드는 스럽 그때 내가 제출하는 방법을 내 그것에 실행 가능한 클래스를 기존 스레드의 산란을 처리하는 경우? 또는 코드를 다시 수정해야합니까? 죄송합니다. 혼란스러워하는 개발자가 기존 코드를 사용하거나 완전히 수정해야 할 경우 혼란 스럽습니다.

+0

실행자 분명히 실행 스레드를 생성합니다. 그리고 그것은 Disruptor에게 넘겨집니다. 해당 클래스에 대한 정보는 제공하지 않지만 executor에 액세스 할 수 있으므로 작업을 확실히 전달할 수 있습니다. – user1252434

+2

초당 100,000 개의 작업을 처리하는 것이 필요한 경우 ExecutorService 만 사용하면 더 간단해질 수 있습니다. 초당 수백만 건의 작업을 처리 할 수 ​​있다면 Disruptor는 좋은 해결책입니다. 이처럼 높은 수준의 성능을 지원해야하는 경우 약간의 코드를 처리 모델에 맞게 변경하면 신경 쓰지 않아도됩니다. 나는 당신이 필요로하는 것이 ExecutorService만을 사용하는 가장 간단한 해결책이라고 생각한다. –

+0

@ PeterLawrey 내 프로그램은 간단한 수학 프로그램이지만 공유 해시 맵을 참조합니다. 문제는 초당 수백만 건의 조회가 있고 그 조회에 기반한 일부 작성입니다. 잠시 동안 redis를 사용하여 최대 6 만 개까지 가져 왔지만 충분하지 않았습니다. Disruptor가 청구서에 맞다고 생각했지만 귀하의 권리는 ExecutorService를 시도한 다음 거기에서부터 시작하겠습니다. –

답변

7

실제 스레드 처리 (작업 항목 제출을 통한)는 Disruptor 내부에서 수행됩니다. 그래서 만약 당신이 (당신의 행운에, 그것은 오픈 소스) its source code 볼 필요가,이를 찾을 수 :

public RingBuffer<T> start() 
{ 
    EventProcessor[] gatingProcessors = eventProcessorRepository.getLastEventProcessorsInChain(); 
    ringBuffer.setGatingSequences(Util.getSequencesFor(gatingProcessors)); 

    checkOnlyStartedOnce(); 
    for (EventProcessorInfo<T> eventProcessorInfo : eventProcessorRepository) 
    { 
     executor.execute(eventProcessorInfo.getEventProcessor()); 
    } 

    return ringBuffer; 
} 
+0

자바 초보자가 기존 (실행 가능한 코드 사용) 코드와 함께 중단기를 사용하는 방법이 있습니까? 또는 이것은 모든 것이 중단 자 특정 실행을 위해 재 작성되어야 함을 의미합니까? –

+0

@learningJava, Disruptor에 대한 경험이 없으므로 질문에 답변 할 수 없습니다. [소개] (http://code.google.com/p/disruptor/)에서 보면 스레드 간 메시징을 전문으로하는 고성능 스레딩 플랫폼 인 것으로 보입니다. 그래서 일반적으로 그것은 현재 당신에게 과잉이라고 할 수 있습니다. 먼저 표준 Executor 프레임 워크를 배우고 사용하는 것이 좋습니다. –

+0

감사합니다 피터, 나는 네 생각을 생각한다. 나는 disruptor가 매우 다르다는 것을 깨닫지 못했습니다. 나는 쓰레드간에 변수를 빠르게 공유 할 수 있도록 코드에 연결 한 라이브러리라고 생각했습니다. 너무 많은 샘플 코드를 찾을 수 없어서 비디오의 고위급 회담에 기초를 두었습니다. –