Java 使用ExecutorService命令写入同一文件

Java 使用ExecutorService命令写入同一文件,java,concurrency,executorservice,reentrantlock,Java,Concurrency,Executorservice,Reentrantlock,我正在尝试实例化ExecutorService中需要按顺序写入文件的任务,所以如果存在33个任务,它们需要按顺序写入 我曾尝试使用LinkedBlockingQueue和ReentrantLock来保证订单,但据我所知,在公平模式下,它将解锁到ExecutorService创建的最年轻的x线程 private final static Integer cores=Runtime.getRuntime().availableProcessors(); 私有最终重入锁定=新重入锁定(false);

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

我曾尝试使用LinkedBlockingQueue和ReentrantLock来保证订单,但据我所知,在公平模式下,它将解锁到ExecutorService创建的最年轻的x线程

private final static Integer cores=Runtime.getRuntime().availableProcessors();
私有最终重入锁定=新重入锁定(false);
私人最终执行人服务任务执行人;
在构造函数中

taskExecutor=新线程池执行器
(cores,cores,1,TimeUnit.MINUTES,新LinkedBlockingQueue());
因此,我处理输入文件对等任务的配额

if(s.isConverting()){
如果(fileLineNumber%quote>0)任务=(fileLineNumber/quote)+1;
else tasks=(fileLineNumber/quote);

对于(int i=0;i,在我看来,除了将输出写入文件之外,所有事情都需要同时进行,并且必须按照对象创建顺序进行


我将从线程代码中提取写入文件的代码
writeResult()
方法,并创建返回由
进程()创建的字符串的未来
方法,并将未来加载到
ArrayList
中。然后可以在for循环中调用
get()迭代ArrayList
在每个将来,使用BufferedWriter或PrintWriter将结果写入文本文件。

如果需要按顺序写入,为什么需要多个线程?为什么不使用单线程执行器?@vanza:因为除了写入文件的代码外,他还需要与大部分代码并发。这是一个更长的讨论虽然磁盘通常要慢得多,所以除非他在做大量的计算,否则多线程是没有帮助的(Amdahl等)。如果他真的愿意,他仍然可以为I/O部分使用单独的单线程执行器。(哦,如果他的并发任务实际上是在计算过程中访问磁盘,那么由于搜索的原因,这些任务所带来的伤害可能比帮助更大。)@vanza所有数据都是在getFileQuote中获得的,每个线程从归档文件中获得一组顺序行并使用它,因此对于33个任务,文件被读取33次以获得其顺序部分。无论如何,我不能在所有情况下都使用完整的文件,我感兴趣的是能够在没有那么多文件的系统中转换GB大小的文件ant RAM。但这会增加内存占用,直接从线程写入不会在内存中保留所有结果。如果不想在内存中保留所有结果,则必须将它们溢出到磁盘(在单独的文件中)然后按照您需要的顺序从中间文件组装最终文件。@user2884025:不,这根本不会增加内存足迹。即使它是在线程中写入文件的,因为您必须按顺序写入所有数据,所以您仍然必须在内存中保存数据,同时等待从该线程写入的完成如果我错了,可以纠正我。@HovercraftFullOfEels,但在线程中写入时,我将只有线程结果内存包,否则我将需要所有任务的内存…在我的场景中,我的机器中只有4个线程,它可以从30个任务中通过。我使用@HovercraftFullOfEels使用未来的想法,因此我可以在线程中写入,但是使用Futures来锁定下一个线程,以便等待在正确的时间写入,如果需要,我将进一步分析备选方案,但在这一刻,答案解决了我的问题。谢谢!