Use o encadeamento para processar pedaço de arquivo por pedaço

Eu tenho um arraylist que consiste em 5000 endereços IP. Para cada endereço IP, quero executar uma solicitação SNMPGet e um comando FTPDownload. Eu quero implementá-lo de uma forma, em que um tempo 2 threads diferentes executados simultaneamente para os primeiros cinco endereços IP. Após a execução desses endereços IP, os próximos 2 endereços IP serão executados nesses encadeamentos. Alguém pode ajudar como fazer isso?

Aqui, a conexão é uma classe que estende o encadeamento e o trabalho a ser implementado é escrito em seu método run (). Por favor ajude.

Connection newConnection =new Connection(0);
Connection newConnection1 =new Connection(1);

for(int i = 0; i < NE_list.getRowCount(); i=i+2)
{
if(NE_list.getValueAt(i, 0).toString().equals("true")) //Some condition here for the IP Address
{

            newConnection.i=i;
            newConnection1.i=i+1;
            newConnection.runprogram();
            newConnection1.runprogram();
 }


    } 

class Connection extends Thread{
int  i;
Connection(int val){
  i=val;
}
void runprogram(){
start();
}
public void run(){
//SNMP and FTP Code here for IP Address in index i of NE_list
}
}

questionAnswers(2)

yourAnswerToTheQuestion