如何维护线程列表?

时间:2014-10-30 14:33:10

标签: java multithreading

我要处理数百个文件。我一次做一个文件,需要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();
    }

}

2 个答案:

答案 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()