1

我正在尝试在 ExecutorService 中实例化需要按顺序写入文件的任务,因此如果存在 33 个任务,他们需要按顺序写入...

我尝试使用 LinkedBlockingQueue 和 ReentrantLock 来保证顺序,但根据我在公平模式下的理解,它解锁到 ExecutorService 创建的 x 个线程中最年轻的一个。

private final static Integer cores =      Runtime.getRuntime().availableProcessors();
private final ReentrantLock lock = new ReentrantLock(false);
private final ExecutorService taskExecutor;

在构造函数中

taskExecutor = new ThreadPoolExecutor
        (cores, cores, 1, TimeUnit.MINUTES, new LinkedBlockingQueue());

所以我处理输入文件对等任务的配额

if(s.isConverting()){
   if(fileLineNumber%quote > 0) tasks = (fileLineNumber/quote)+1;
   else tasks = (fileLineNumber/quote);
   for(int i = 0 ; i<tasks || i<1 ; i++){
      taskExecutor.execute(new ConversorProcessor(lock,this,i));
   }
}

任务做

public void run() {
    getFileQuote();
    resetAccumulators();
    process();
    writeResult();
}

我的问题出现在这里:

private void writeResult() {
    lock.lock();
    try {
        BufferedWriter bw = new BufferedWriter(new FileWriter("/tmp/conversion.txt",true));
        Integer index = -1;
        if(i == 0){
            bw.write("ano dia tmin tmax tmed umid vento_vel rad prec\n");
        }
        while(index++ < getResult().size()-1){
            bw.write(getResult().get(index) + "\n");
        }
        if(i == controller.getTasksNumber()){ 
            bw.write(getResult().get(getResult().size()-1));
        }
        else{ 
            bw.write(getResult().get(getResult().size()-1) + "\n");
        }
        bw.close();
    } catch (IOException ex) {
        Logger.getLogger(ConversorProcessor.class.getName()).log(Level.SEVERE, null, ex);
    } finally { 
        lock.unlock(); 
    }

}
4

1 回答 1

0

在我看来,除了将输出写入文件之外,所有事情都需要同时完成,并且必须按照对象创建顺序完成。

我将从您的线程代码中取出写入文件、writeResult()方法的代码,而是创建返回由process()方法创建的字符串的 Futures,并将 Futures 加载到ArrayList<Future<String>>. 然后,您可以遍历 ArrayList,在 for 循环中调用get()每个 Future,并使用 BufferedWriter 或 PrintWriter 将结果写入文本文件。

于 2014-09-28T01:06:26.167 回答