protected void processBackgroundReads() {
        logger.info("Processing background reads...");
        logger.info("Computing RPKM values using " + threads + " threads...");
        long tstart = System.currentTimeMillis();
        this.transcripts = new ArrayList<TranscriptRecord>();

        GeneModelProducer producer = new GeneModelProducer();
        producer.start();

        // Leave one thread for the GTF producer
        if (threads > 1)
            threads--;
        ArrayList<GeneModelConsumer> consumers = new ArrayList<GeneModelConsumer>();

        for (int i = 0; i < threads; i++) {
            GeneModelConsumer consumer = new GeneModelConsumer(backgroundFile);
            consumer.start();
            consumers.add(consumer);
        }

        try {
            producer.join();
            for (GeneModelConsumer c : consumers) {
                c.join();
            }
        } catch (InterruptedException e) {}
        
        // Reduce
        for(GeneModelConsumer c : consumers) {
            for(TranscriptRecord t : c.getTranscripts()) {
                transcripts.add(t);
            }
            c.clearTranscripts();
        }

        long tend = System.currentTimeMillis();
        double totalTime = ((tend - tstart)/1000);
        logger.info("Finished processing background file in: "+totalTime + "s");
    }