Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadPoolExecutor创建重复线程_Java_Multithreading_Threadpool - Fatal编程技术网

Java ThreadPoolExecutor创建重复线程

Java ThreadPoolExecutor创建重复线程,java,multithreading,threadpool,Java,Multithreading,Threadpool,我需要读取一个大的csv文件(328MB)并对其进行处理。每行的处理还包括调用Web服务 我第一次使用ThreadPoolExecutor。我的逻辑是,我将从csv中每100行吐出一个线程,该线程将运行和处理每一行,并将结果写入templ文件。完成所有线程后,我将读取临时文件并创建一个comined输出文件 我的分割文件并创建线程的方法 private List<Thread> invokeWS(String csvFilename, String tempFolder) {

我需要读取一个大的csv文件(328MB)并对其进行处理。每行的处理还包括调用Web服务

我第一次使用ThreadPoolExecutor。我的逻辑是,我将从csv中每100行吐出一个线程,该线程将运行和处理每一行,并将结果写入templ文件。完成所有线程后,我将读取临时文件并创建一个comined输出文件

我的分割文件并创建线程的方法

private List<Thread> invokeWS(String csvFilename, String tempFolder) {

    List<Thread> processCsvThreadList = new ArrayList<Thread>();

    //Thread Pool Executer


    int corePoolSize = 3;
    int maximumPoolSize = 6;
    long keepAliveTime = 10;
     ThreadFactory threadFactory = Executors.defaultThreadFactory();


    ThreadPoolExecutor thrdPoolEx = new ThreadPoolExecutor(corePoolSize,
            maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
            new ArrayBlockingQueue<Runnable>(2));


    try {
        BufferedReader bfr = new BufferedReader(new FileReader(csvFilename));
        String line = "";
        int i = 0;
        line = bfr.readLine();
        Thread csvThread;
        List<String> rowList = new ArrayList<String>();


        do {
            line = bfr.readLine();
            if (line != null) {

                rowList.add(line);
                i++;

                if (i % 100 == 0) {

                    csvThread = new Thread(new ProcessCsvRow(rowList,
                            tempFolder));
                    csvThread.start();
                    thrdPoolEx.execute(csvThread);

                    rowList = new ArrayList<String>();
                    processCsvThreadList.add(csvThread);
                }

            } else {
                if (null != rowList && !rowList.isEmpty()) {

                    csvThread = new Thread(new ProcessCsvRow(rowList,
                            tempFolder));
                    csvThread.start();
                    thrdPoolEx.execute(csvThread);

                    processCsvThreadList.add(csvThread);
                }
                break;
            }
        } while (true);




    } catch (FileNotFoundException fnf) {
        fnf.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally{
        thrdPoolEx.shutdown();
        }
    return processCsvThreadList;
}
private List invokeWS(字符串csvFilename,字符串tempFolder){
List processCsvThreadList=新建ArrayList();
//线程池执行器
int corePoolSize=3;
int maximumPoolSize=6;
长keepAliveTime=10;
ThreadFactory ThreadFactory=Executors.defaultThreadFactory();
ThreadPoolExecutor thrdPoolEx=新的ThreadPoolExecutor(corePoolSize,
maximumPoolSize、keepAliveTime、TimeUnit.s、,
新的ArrayBlockingQueue(2));
试一试{
BufferedReader bfr=新的BufferedReader(新文件读取器(csvFilename));
字符串行=”;
int i=0;
line=bfr.readLine();
线程csvThread;
List rowList=new ArrayList();
做{
line=bfr.readLine();
如果(行!=null){
行列表。添加(行);
i++;
如果(i%100==0){
csvThread=新线程(新进程)CSVROW(行列表,
临时文件夹);
csvThread.start();
execute(csvThread);
行列表=新的ArrayList();
processCsvThreadList.add(csvThread);
}
}否则{
if(null!=rowList&!rowList.isEmpty()){
csvThread=新线程(新进程)CSVROW(行列表,
临时文件夹);
csvThread.start();
execute(csvThread);
processCsvThreadList.add(csvThread);
}
打破
}
}虽然(正确);
}捕获(FileNotFoundException fnf){
fnf.printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
最后{
thrdPoolEx.shutdown();
}
返回进程csvthreadlist;
}
我的课程

public class ProcessCsvRow implements Runnable {

private List<String> csvRowsList;
private String tempDir;

public ProcessCsvRow(List<String> csvRowsList, String tempDir) {

    this.csvRowsList = csvRowsList;
    this.tempDir = tempDir;
}

@Override
public void run() {
    UUID idOne = UUID.randomUUID();
    FileWriter fw = null;
    BufferedWriter bufferedWriter = null;
    try {
        String res = "";
        fw = new FileWriter(new File(tempDir + "\\" + idOne.toString()+FilePropConstants.FILE_NAME_EXT_TMP));

        bufferedWriter = new BufferedWriter(fw);
        SentimentAnalyzer sentimentAnalyzer = new SentimentAnalyzer();

        for (String csvRow : csvRowsList) {
            //calling webservice for each row

            res = sentimentAnalyzer.invokeSentWS(csvRow);
            bufferedWriter.write(res);


        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bufferedWriter != null) {
                bufferedWriter.flush();
                bufferedWriter.close();
            }
            if (fw != null) {
                fw.close();
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
公共类ProcessCsvRow实现可运行{
私人名单;
私有字符串tempDir;
公共进程csvrow(列表csvRowsList,字符串tempDir){
this.csvRowsList=csvRowsList;
this.tempDir=tempDir;
}
@凌驾
公开募捐{
UUID idOne=UUID.randomuid();
FileWriter fw=null;
BufferedWriter BufferedWriter=null;
试一试{
字符串res=“”;
fw=newfilewriter(新文件(tempDir+“\\”+idOne.toString()+FilePropConstants.File\u NAME\u EXT\u TMP));
bufferedWriter=新的bufferedWriter(fw);
感伤分析器感伤分析器=新建感伤分析器();
用于(字符串csvRow:csvRowsList){
//为每行调用webservice
res=感伤分析器.invokeSentWS(csvRow);
bufferedWriter.write(res);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
if(bufferedWriter!=null){
bufferedWriter.flush();
bufferedWriter.close();
}
如果(fw!=null){
fw.close();
}
}捕获(IOEX异常){
例如printStackTrace();
}
}
}
}

问题是,对于5行csv,是否应该创建一个临时文件,但当我运行此程序时,生成了两个临时文件,这是错误的。我坚信这不是一个逻辑问题,而是我实现ThreadPoolExecuter的方式


非常感谢您的帮助。

您不应该创建线程,也不需要直接创建线程池

试一试


顺便说一句,每个线程都必须创建自己的输出文件,或者您需要锁定一个共享文件,或者您可以提交一个可调用文件,并让它返回您想要记录到提交线程的内容。

这是因为您都在自己启动线程,并要求执行者执行它

更改:

csvThread = new Thread(new ProcessCsvRow(rowList, tempFolder));
csvThread.start();
thrdPoolEx.execute(csvThread);

rowList = new ArrayList<String>();
processCsvThreadList.add(csvThread);
csvThread=新线程(新进程csvrow(行列表,tempFolder));
csvThread.start();
execute(csvThread);
行列表=新的ArrayList();
processCsvThreadList.add(csvThread);
致:

csvThread=新线程(新进程csvrow(行列表,tempFolder));
execute(csvThread);
行列表=新的ArrayList();
processCsvThreadList.add(csvThread);

@PeterLawrey-我知道,但他想知道自己做错了什么,所以我解释了。一般来说,我认为他应该对生产者/消费者模型使用完全不同的方法,然后对每个线程批处理100个调用。谢谢Peter,它成功了。我修改了我的代码,最后添加了{taskExecutor.shutdown();尝试{taskExecutor.waitTermination(Long.MAX_VALUE,TimeUnit.NANOSECONDS)}catch(InterruptedException e){}除非您真的需要等待线程池完成,否则我只调用shutdown();
csvThread = new Thread(new ProcessCsvRow(rowList, tempFolder));
csvThread.start();
thrdPoolEx.execute(csvThread);

rowList = new ArrayList<String>();
processCsvThreadList.add(csvThread);
csvThread = new Thread(new ProcessCsvRow(rowList, tempFolder));
thrdPoolEx.execute(csvThread);

rowList = new ArrayList<String>();
processCsvThreadList.add(csvThread);