Java多线程和迭代器,应该简单,初学者

时间:2012-12-07 07:23:29

标签: java multithreading iterator

首先,我想说我正在从python到更复杂的代码。我现在正在使用Java,而且我非常新。我知道Java非常擅长多线程,这很好,因为我用它来处理太字节数据。

数据输入只是输入到迭代器中,我有一个类封装了一个运行函数,该函数从迭代器获取一行,进行一些分析,然后将分析写入文件。线程必须彼此共享的唯一信息是它们要写入的对象的名称。简单吧?我只是想让每个线程同时执行run函数,这样我们就可以快速迭代输入数据。在python中,它很简单。

from multiprocessing import Pool
f = open('someoutput.csv','w');
def run(x):
f.write(analyze(x))

p = Pool(8);
p.map(run,iterator_of_input_data);

所以在Java中,我有10K行的分析代码,可以很容易地遍历我的输入,传递给我的run函数,然后调用我的所有分析代码将它发送到输出对象。

public class cool {
    ...
    public static void run(Input input,output) {
        Analysis an = new Analysis(input,output);    
    }
    public static void main(String args[]) throws Exception {
        Iterator iterator = new Parser(File(input_file)).iterator();
        File output = File(output_object);
        while(iterator.hasNext(){
            cool.run(iterator.next(),output);
        }
    }
}

我想做的就是让多个线程获取迭代器对象并执行run语句。一切都是独立的。我一直在寻找java多线程的东西,但它用于通过网络进行交谈,共享数据等。这是否很简单,因为我认为它是?如果有人能指出我正确的方向,我很乐意做腿部工作。

感谢

1 个答案:

答案 0 :(得分:2)

ExecutorService(ThreadPoolExecutor)将是Java equivelant。

ExecutorService executorService =
    new ThreadPoolExecutor(
        maxThreads, // core thread pool size
        maxThreads, // maximum thread pool size
        1, // time to wait before resizing pool
        TimeUnit.MINUTES, 
        new ArrayBlockingQueue<Runnable>(maxThreads, true),
        new ThreadPoolExecutor.CallerRunsPolicy());

ConcurrentLinkedQueue<ResultObject> resultQueue;

while (iterator.hasNext()) {
    executorService.execute(new MyJob(iterator.next(), resultQueue))
}

将您的工作作为Runnable实施。

class MyJob implements Runnable {
    /* collect useful parameters in the constructor */
    public MyJob(...) {
        /* omitted */
    }

    public void run() {
        /* job here, submit result to resultQueue */
    }
}

resultQueue 用于收集作业的结果。

有关详细信息,请参阅java api documentation