Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 多线程,读取多个文件并写入新文件_Java_Multithreading_File - Fatal编程技术网

Java 多线程,读取多个文件并写入新文件

Java 多线程,读取多个文件并写入新文件,java,multithreading,file,Java,Multithreading,File,因此,每个新线程都可以选择下一个文件。 谢谢你的帮助 错误: public synchronized void getAllFilesInArrayList() { return nextFile; } 首先,您解决问题的方法将导致比看起来必要的更多的同步和竞争条件问题。防止线程竞速的一个简单策略是: 1让调度程序线程读取目录中的所有文件名 2对于每个文件,让调度程序线程生成一个工作线程并传递文件引用 3让工作线程处理文件 4确保输出文件名有一些合理的命名约定,这样就不

因此,每个新线程都可以选择下一个文件。 谢谢你的帮助

错误:

public synchronized void getAllFilesInArrayList() {
        return nextFile;
    }

首先,您解决问题的方法将导致比看起来必要的更多的同步和竞争条件问题。防止线程竞速的一个简单策略是:

1让调度程序线程读取目录中的所有文件名

2对于每个文件,让调度程序线程生成一个工作线程并传递文件引用

3让工作线程处理文件

4确保输出文件名有一些合理的命名约定,这样就不会让线程相互覆盖


至于使用执行器,ThreadPoolExecutor可能工作得很好。去看看javadoc:

So?让它成为多线程的。有什么问题吗?看起来你已经知道你应该做什么了。不,我不知道,这就是我在这里发布的原因。你说你需要N个线程,你说你想使用executor框架。如果你不知道如何使用这些东西,用谷歌搜索。您使用synchronized关键字的想法是正确的。试试吧,看看你能做些什么,你可能会给自己一个惊喜。如果您在新发现的知识方面遇到任何问题,请回来。好的,谢谢。您使用synchronized关键字的想法是正确的。我对此不确定。请记住在同步方法中更改nextFile变量-我将调用方法getNextFile并让它返回一个文件对象,并且记住void方法不能返回任何内容。这使您的返回成为下一个文件;有点奇怪。我想我更喜欢你的方法。请给我一些代码。谢谢。@NomanArain您已经有了一些代码,Aurand基本上给了您四步伪代码。不要总是期望一个完整的解决方案。这是StackOverflow,请不要为我做我的工作。我怀疑我们是否可以通过多线程来提高性能。多线程将导致更频繁的磁头移动。在我的例子中,单线程性能大约相当于10-50个线程。如果我增加池中的线程数,它将继续降级。
public synchronized void getAllFilesInArrayList() {
        return nextFile;
    }
Exception in thread "Thread-0" java.lang.IllegalArgumentException
    at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:589)
    at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:480)
    at java.util.concurrent.Executors.newFixedThreadPool(Executors.java:59)
    at Test6.run(Test6.java:112)
    at java.lang.Thread.run(Thread.java:662)