当前位置: 首页 > 面试题库 >

使用线程逐块处理文件

奚昌胤
2023-03-14
问题内容

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

在这里,连接是扩展线程的类,要实现的工作在其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框架将最适合您的解决方案。我在这里创建了一个示例。您可以根据需要增加线程数。

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<String> list = new ArrayList<String>();
    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<String> list = new ArrayList<String>();
        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();
    }

}


 类似资料:
  • 从主线程读取文件 将读取值存储到blockingqueue中,另一个线程将从中访问和处理。 有另一个线程要写入另一个文件。 但我不知道如何做到这一点。如果我声明了一个fixedthreadpool,我将无法控制哪个线程执行什么操作,但在这种方法中,这是否类似于顺序处理,因为线程属于不同的池? 如果有人能指导我如何执行此操作,这将对我有很大帮助。

  • 我使用的是Spring Batch 2.1.8。释放我有一个文件,它由一些头信息和一些需要处理的记录组成。 我有一个使用面向块处理的步骤。该步骤包含ItemReader和ItemWriter的实现。ItemReader实现是线程安全的,而ItemWriter不是。 我想在处理(或写入)任何记录之前使用标题信息。在继续使用面向块的处理时,如何确保这一点? 建议的解决方案:一种解决方案可以是编写一个预

  • 问题内容: 我想逐个读取文件。该文件分为几部分,分别存储在不同类型的媒体上。我目前要做的是调用文件的每个单独部分,然后将其合并回原始文件。 问题是我需要等到所有块都到达后才能播放/打开文件。是否有可能在块到达时读取块,而不是等待它们全部到达。 我正在处理媒体文件(电影文件)。 问题答案: 您要的是源数据线。当数据太大而无法一次将其保存在内存中时,这是完美的选择,因此您可以在接收整个文件之前开始播放

  • 我的问题陈述。读取包含1000万数据的csv文件,并将其存储在数据库中。用尽可能少的时间 我使用java的简单多线程执行器实现了它,其逻辑几乎与spring batch的chunk相似。从csv文件中读取预配置数量的数据,然后创建一个线程,并将数据传递给线程,该线程验证数据,然后写入多线程运行的文件。完成所有任务后,我将调用sql loader来加载每个文件。现在我想把这段代码移到spring b

  • 在Spring批处理中,我试图读取CSV文件,并希望将每一行分配给一个单独的线程并对其进行处理。我试图通过使用TaskExecutor来实现它,但所有线程都在一次拾取同一行。我还尝试使用Partioner实现这个概念,同样的事情也发生了。请参阅下面我的配置Xml。 步骤说明 我尝试过不同类型的任务执行器,但它们的行为方式都是一样的。如何将每一行分配给单独的线程?