2016-06-16 4 views
1

나는 Task-A와 Task-B의 2 가지 작업을 가지고있다. Task-A는 ResultSet의 반환 유형을 가지며 DB에서 한 번에 1000 개의 행을 반환합니다. 이 작업은 DB에 10,000 개의 행이있는 10 번 실행될 것입니다 (DB의 행의 총 개수가 알려지지 않은 경우도 고려하십시오). Task-B에는 void 반환 유형이 있으며 Sysout 만 수행합니다. Task-A가 Task-B에 반환 한 처음 1000 개의 행을 전달해야하며 Task-B가 해당 행을 통해 작동하므로 Task-A를 병렬로 실행하여 Task-B가 처음 1000 개 레코드, 다음 1000 개 레코드 집합은 작업 -A에 의해 반환되어야합니다. 자바에서 어떻게 할 수 있는지 알려주세요. 가능한 경우 모든 코드 스 니펫이 도움이됩니다. 감사합니다Java에서 병렬로 2 개의 작업을 실행하는 방법은 무엇입니까?

+5

통신을위한 대기열에 의해 결합 된 두 개의 스레드 (소비자 및 생산자) 작성을 살펴보십시오. 여기 예제 : http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html –

+0

두 가지 작업으로 두 개의 스레드를 의미합니까? Java에서 람다를 사용하는 방법을 멋지게 보여주기 때문에이 두 가지 스레드를 살펴보십시오. 8 별도의 스레드를 쉽게 시작할 수 있습니다. https://www.youtube.com/watch?v=1OpAgZvYXLQ – TJA

+0

감사! 이것은 내 문제를 해결하는 것, 시도합니다 :) @ 크리스 K –

답변

1

나는 여기에 키가 블로킹 큐를 사용하는 것에 동의합니다. 저는 한 가지 고급 솔루션 인 DBThread for Task-B와 PrinterThread for Task-B와 ResultSet 블로킹 큐에 동의합니다. 두 스레드간에 공유되는 :

class DBThread extends Thread { 
    private BlockingQueue<ResultSet> resultSets; 
    public DBThread(BlockingQueue<ResultSet> resultSets) { 
     this.resultSets = resultSets; 
    } 

    public void run() { 
     try { 
     resultSets.put(getResultsFromDB()); //resultSets.put() call will block if the queue is full 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 

    private ResultSet getResultsFromDB() { 
     ResultSet resultSet = fromDB(); //some method to get ResultSet from DB 
     return resultSet; 
    } 
} 

class PrinterThread extends Thread { 
    private BlockingQueue<ResultSet> resultSets; 
    public PrinterThread(BlockingQueue<ResultSet> resultSets) { 
     this.resultSets = resultSets; 
    } 

    public void run() { 
     try { 
     printLogs(resultSets.take()); //resultSets.take() call will block if the queue is empty 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 

    private void printLogs(ResultSet resultSet) { 
     //print rows 
    } 
} 

class Main { 

    public static void main(String[] args) { 
     BlockingQueue<ResultSet> resultSets = new LinkedBlockingQueue<>(10); 
     DBThread dbThread = new DBThread(resultSets); 
     PrinterThread printerThread = new PrinterThread(resultSets); 
     dbThread.start(); 
     printerThread.start(); 
    } 
} 
관련 문제