1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
package kmer;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import fileIO.ByteStreamWriter;
import shared.Shared;
import shared.Tools;
import structures.ByteBuilder;
/**
* @author Brian Bushnell
* @date Nov 16, 2015
*
*/
public class DumpThread extends Thread{
public static boolean dump(final int k, final int mincount, final int maxcount, final AbstractKmerTable[] tables, final ByteStreamWriter bsw, AtomicLong remaining){
final int threads=NUM_THREADS>0 ? NUM_THREADS : Tools.min(tables.length, (Tools.mid(1, Shared.threads()-1, 6)));
final AtomicInteger lock=new AtomicInteger(0);
final ArrayList<DumpThread> list=new ArrayList<DumpThread>(threads);
for(int i=0; i<threads; i++){
list.add(new DumpThread(k, mincount, maxcount, lock, tables, bsw, remaining));
}
for(DumpThread t : list){t.start();}
boolean success=true;
for(DumpThread t : list){
while(t.getState()!=Thread.State.TERMINATED){
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
success&=t.success;
}
return success;
}
public DumpThread(final int k_, final int mincount_, final int maxcount_, final AtomicInteger nextTable_, final AbstractKmerTable[] tables_, final ByteStreamWriter bsw_, final AtomicLong toDump_){
k=k_;
mincount=mincount_;
maxcount=maxcount_;
nextTable=nextTable_;
tables=tables_;
bsw=bsw_;
remaining=toDump_;
}
@Override
public void run(){
final ByteBuilder bb=new ByteBuilder(16300);
for(int i=nextTable.getAndIncrement(); i<tables.length; i=nextTable.getAndIncrement()){
AbstractKmerTable t=tables[i];
t.dumpKmersAsBytes_MT(bsw, bb, k, mincount, maxcount, remaining);
}
if(bb.length()>0){
synchronized(bsw){bsw.addJob(bb);}
}
success=true;
}
final int k;
final int mincount;
final int maxcount;
final AtomicLong remaining;
final AtomicInteger nextTable;
final AbstractKmerTable[] tables;
final ByteStreamWriter bsw;
boolean success=false;
public static int NUM_THREADS=-1;
}
|