使用线程按块处理文件块

我有一个由5000个IP地址组成的arraylist。 对于每个IP地址,我想执行SNMPGet请求和FTPDownload命令。 我想以一种方式实现它,其中一次为前五个IP地址同时运行2个不同的线程。 在执行这些IP地址之后,将在这些线程上执行接下来的2个IP地址。 任何人都可以帮忙怎么做?

这里,connection是一个扩展线程的类,要实现的工作是在run()方法中编写的。 请帮忙。

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 } } 

Executor Framework最适合您的解决方案。 我在这里创建了一个例子。 您可以根据需要增加线程数。

 import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class SomeRunnable implements Runnable { int threadNo = -1 ; List list = new ArrayList(); public SomeRunnable(List list, int threadNo ) { this.list.addAll(list); this.threadNo =threadNo; } @Override public void run() { for (String element : list) { System.out.println("By Thread:" + threadNo+", Processed Element:" +element); } } } public class ExecutorDemo { public static void main(String[] args) { List list = new ArrayList(); for (int i = 0; i < 100; i++) { list.add("Elem:"+i); } // Divide list int divideIndex = list.size()/2; //Create objects of Runnable SomeRunnable obj1 = new SomeRunnable(list.subList(0, divideIndex),1); SomeRunnable obj2 = new SomeRunnable(list.subList(divideIndex,list.size()),2); //Create fixed Thread pool, here pool of 2 thread will created ExecutorService pool = Executors.newFixedThreadPool(2); pool.execute(obj1); pool.execute(obj2); pool.shutdown(); } } 

在此添加具有5个线程的工作示例。 只需将test.txt放在应用程序的CLASS_PATH中。

 class MyRunnable implements Runnable { List> records; MyRunnable(List> records){ this.records = records; } public void run(){ for(List list : records){ System.out.println(Thread.currentThread().getName() + " : "+list.toString()); } }} 

主类 –

 public class FileProcessThreads { public List> process(String fileName) throws IOException { List> records = new ArrayList<>(); BufferedReader br = new BufferedReader(new FileReader(fileName)); String line = null; while((line = br.readLine()) != null){ List listValues = Arrays.asList(line.split(" ")); records.add(listValues); } System.out.println(records.size()); return records; } public static void main(String[] args) throws IOException { FileProcessThreads fp = new FileProcessThreads(); List> records = fp.process("test.txt"); ExecutorService es = Executors.newFixedThreadPool(5); int recordsInEachThread = (int) (records.size()/5); System.out.println(recordsInEachThread); MyRunnable my1 = new MyRunnable(records.subList(0, recordsInEachThread)); MyRunnable my2 = new MyRunnable(records.subList(recordsInEachThread+1, recordsInEachThread*2)); MyRunnable my3 = new MyRunnable(records.subList(recordsInEachThread*2 + 1, recordsInEachThread*3)); MyRunnable my4 = new MyRunnable(records.subList(recordsInEachThread*3 + 1, recordsInEachThread*4)); MyRunnable my5 = new MyRunnable(records.subList(recordsInEachThread*4 + 1, records.size() - 1)); es.execute(my1); es.execute(my2); es.execute(my3); es.execute(my4); es.execute(my5); es.shutdown(); }}