我要处理数百个文件。我一次做一个文件,需要30分钟。
我认为我可以在10个同步线程中进行此处理,一次10个文件,我可以在3分钟内完成,而不是30分钟。
我的问题是,"正确的"管理我的10个线程的方法?当一个完成后,创建一个新的最大数量为10。
这就是我到目前为止......这是"正确的"这样做的方法?
public class ThreadTest1 {
public static int idCounter = 0;
public class MyThread extends Thread {
private int id;
public MyThread() {
this.id = idCounter++;
}
public void run() {
// this run method represents the long-running file processing
System.out.println("I'm thread '"+this.id+"' and I'm going to sleep for 5 seconds!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I'm thread '"+this.id+"' and I'm done sleeping!");
}
}
public void go() {
int MAX_NUM_THREADS = 10;
List<MyThread> threads = new ArrayList<MyThread>();
// this for loop represents the 200 files that need to be processed
for (int i=0; i<200; i++) {
// if we've reached the max num of threads ...
while (threads.size() == MAX_NUM_THREADS) {
// loop through the threads until we find a dead one and remove it
for (MyThread t : threads) {
if (!t.isAlive()) {
threads.remove(t);
break;
}
}
}
// add new thread
MyThread t = new MyThread();
threads.add(t);
t.start();
}
}
public static void main(String[] args) {
new ThreadTest1().go();
}
}
答案 0 :(得分:2)
您可以使用ExecutorService来管理线程。
并且可以向线程运行方法添加while
循环以重复执行文件处理任务。
您还可以阅读有关BlockingQueue用法的信息。我认为它非常适合在线程之间分配新文件(任务)。
答案 1 :(得分:0)
如果您愿意,我建议您使用Camel's File component。该组件将处理并发的所有问题,以确保多个线程不会尝试处理相同的文件。使代码多线程的最大挑战是确保线程不会交互。让框架为您解决这个问题。
示例:
from("file://incoming?maxMessagesPerPoll=1&idempotent=true&moveFailed=failed&move=processed&readLock=none")
.threads(10).process()