Thread Java - Leitura/Escritar arquivo - JAVA

Opa galera beleza?

Preciso fazer a leitura de um arquivo txt em que cada linha é um cpf ou cnpj, calcular o digito verificador deles e depois escrever em um novo arquivo usando multi Threads em Java para fazer no menor tempo possivel esse processo.

Eu fiz, mas o arquivo está sendo gravada com informações com duplicidade, alguém pode me ajudar?
Alguém pode me ajudar?

Segue código:


package com.example.sistemasdistribuidos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class SistemasCpf {
  
	private static final String VIRGULA = "\n";
    private static BufferedReader reader;
    private static String TEMPO= null;
    private static String linha = null;
    private static FileWriter filew = null;
    
    private static final List<String[]> lista = Collections.synchronizedList(new ArrayList<>());
    

     public static void main(String[] args) throws Exception {
    	 
    	 
    	 
    	 //Abrindo arquivo para leitura
         File file = new File(SistemasCpf.class.getResource("/arquivosCpfCnpj/BASEPROJETO.txt").getFile());
         try {
			reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         
         while ((linha = reader.readLine()) != null) {
		     String[] dadosUsuario = linha.split(VIRGULA);
		     lista.add(dadosUsuario);
		    
		}
         try {
				filew = new FileWriter(SistemasCpf.class.getResource("/arquivosCpfCnpj/CPFCNPJ.txt").getFile());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
         PrintWriter gravarArq = new PrintWriter(filew);
   
	         
    	
 
    	 Thread t1 = new Thread(new Runnable() {
	             @Override
	             public void run() {
		    	//Abrindo arquivo para escrita
	            long start = System.currentTimeMillis();
		            for( String[] str : lista) {
			        	 synchronized(str) {
				        	 String numero = retornaNumero(str);
				             gravaNoArquivo(numero, gravarArq);  
			        	 }  
		            }
			    				
				long tempoFinal = System.currentTimeMillis();
				
				
			    System.out.printf("Primeira Thread: %.3f ms%n", (tempoFinal - start) / 1000d);
				
		     }
    	 });
    	 
    	 Thread t2 = new Thread(new Runnable() {
             @Override
             public void run() {
	            long start = System.currentTimeMillis();
	            for( String[] str : lista) {
		        	 synchronized(str) {
			        	 String numero = retornaNumero(str);
			             gravaNoArquivo(numero, gravarArq);  
		        	 }
	            }
		    	
				
			long tempoFinal = System.currentTimeMillis();
			
		    System.out.printf("Segunda Thread:%.3f ms%n", (tempoFinal - start) / 1000d);
			
	     }
	 });
    	
    	 t1.start();
	     t2.start();
	     
	     t1.join();
	     t2.join();
	  
	     
	     filew.close();
         
     }
     
     private static String retornaNumero(String[] str) {
    	 String valida = Arrays.toString(str);
    	 valida = valida.substring(1, valida.length()-1).replace("]", "").replace("[", "").replaceAll("\\s+","");
    	 
    	 //Verifica se é Cpf, caso retorne falso é um Cnpj
         boolean validaCpf = verificaEhCpf(valida);
         
         String numero;
         if(validaCpf) {
        	 VerificadorCpf verificarCPF = new VerificadorCpf();
        	 numero = verificarCPF.obterNumeracaoCPF(valida);
         }else {
        	 VerificadorCnpj verificadorCnpj = new VerificadorCnpj();
        	 numero = verificadorCnpj.obterNumeracaoCNPJ(valida);
	    
         } 
         return numero;
     }
     
     private static void gravaNoArquivo(String n,PrintWriter gravarArq) {
         gravarArq.println(n);
     }
 
     static boolean verificaEhCpf(String numero) {
    	 return numero.length() == 9;
    	 
     }
     
}