Для вашей задачи может быть достаточно просто использовать один поток и писать в файл, используя BufferedOutputStream
, когда вы читаете из базы данных.
Если вы хотите больше контролировать размер буфера и размер фрагментов, записываемых в файл, вы можете сделать что-то вроде этого:
class Producer implements Runnable {
private final OutputStream out;
private final SomeDBClass db;
public Producer( OutputStream out, SomeDBClass db ){
this.out = out;
this.db = db;
}
public void run(){
// If you're writing to a text file you might want to wrap
// out in a Writer instead of using `write` directly.
while( db has more data ){
out.write( the data );
}
out.flush();
out.close();
}
}
class Consumer implements Runnable {
private final InputStream in;
private final OutputStream out;
public static final int CHUNKSIZE=512;
public Consumer( InputStream in, OutputStream out ){
this.out = out;
this.in = in;
}
public void run(){
byte[] chunk = new byte[CHUNKSIZE];
for( int bytesRead; -1 != (bytesRead = in.read(chunk,0,CHUNKSIZE) );;){
out.write(chunk, 0, bytesRead);
}
out.close();
}
}
И в вызывающем коде:
FileOutputStream toFile = // Open the stream to a file
SomeDBClass db = // Set up the db connection
PipedInputStream pi = new PipedInputStream(); // Optionally specify a size
PipedOutputStream po = new PipedOutputStream( pi );
ExecutorService exec = Executors.newFixedThreadPool(2);
exec.submit( new Producer( po, db ) );
exec.submit( new Consumer( pi, toFile ) );
exec.shutdown();
- Также ловите любые исключения, которые могут быть выброшены.
Обратите внимание, что если это все, что вы делаете, нет никаких преимуществ в использовании ExecutorService
. Исполнители полезны, когда у вас много задач (слишком много, чтобы запускать их все в потоках одновременно). Здесь у вас есть только два потока, которые должны выполняться одновременно, поэтому прямой вызов Thread#start
будет иметь меньше накладных расходов.
person
trutheality
schedule
02.05.2012
Runnable
для потребителя и производителя и отправить их вExecutorService
? - person trutheality   schedule 02.05.2012