public boolean readNext() {
      ExecutionReq executionReq = null;
      this.cntExecutions++;
      try {
        synchronized (executionReqQueue) {
          if (executionReqQueue.size() > 0) {
            executionReq = executionReqQueue.get(0);
            executionReqQueue.remove(0);
          }
        }
        if (executionReq != null) {
          executionReq.log(this.threadNumber, this.cntExecutions, "started");

          executionReq.startedAt = System.currentTimeMillis();
          Downloader downloader =
              new Downloader(executionReq, this.threadNumber, this.cntExecutions);
          Parser parser = new Parser(executionReq, this.threadNumber, this.cntExecutions);

          downloader.start();
          parser.start();

          parser.join();
          executionReq.endedAt = System.currentTimeMillis();
          executionReq.log(
              this.threadNumber,
              this.cntExecutions,
              "completed OK in "
                  + ((int) ((executionReq.endedAt - executionReq.startedAt) / 1000))
                  + " seconds");
          executionReq.logCompleted(this.threadNumber, this.cntExecutions);
        }
      } catch (Exception ex) {
        if (executionReq != null) {
          try {
            executionReq.log(this.threadNumber, this.cntExecutions, "an error occurred:" + ex);
            if (executionReq.outFile != null && executionReq.outFile.exists())
              executionReq.outFile.delete();
          } catch (Exception e2) {
          }
        } else {
          ex.printStackTrace();
        }
        executionReq = null;
      }
      return executionReq != null;
    }
 public static void main(String[] args) {
   Parser p = new Parser();
   p.start();
 }