2016-06-16 19 views
1

私は2つのタスク、タスクAとタスクBを持っています。タスク-Aは、戻り値の型のResultSetを持ち、DBから1ショットで1000行を返します。このタスクは、DBが10,000行を持つ10回実行されます(DB内の行の総数が不明な場合も考慮されます)。タスクBには戻り値の型があり、Sysoutだけです。私はTask-Aによって返された最初の1000行をTask-Bに渡す必要があり、Task-Bがそれらの行を操作しているので、Task-Aを並列に実行して、Task-Bが最初の1000レコード、1000レコードの次のセットは、タスクAによって返されます。 これはどのようにjavaで行うことができるか教えてください。可能であれば、任意のコードスニペットが役立ちます。 ありがとう2つのタスクをJavaで並列に実行するには?

+5

通信用のキューで結合された2つのスレッド(コンシューマとプロデューサ)の作成を見てみましょう。ここでの例:http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html –

+0

2つのタスクでは2つのスレッドを意味しますが、Javaでlambdaを使用する方法をうまく示しているので、これを見てください。 8で簡単に別のスレッドを開始するhttps://www.youtube.com/watch?v=1OpAgZvYXLQ – TJA

+0

ありがとう!これは私の問題を解決すると思われる:) @クリスK –

答えて

1

私は@Chris Kと合意しました。ここではキーはブロックキューを使用しています。タスク-AのDBThreadとタスク-BのPrinterThread、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(); 
    } 
} 
関連する問題