Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Iterator - Fatal编程技术网

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

Java多线程和迭代器,应该是简单的,初学者,java,multithreading,iterator,Java,Multithreading,Iterator,首先我想说的是,我正在从python向更复杂的代码迈进。我现在开始学习Java,而且我是个新手。我知道Java非常擅长多线程处理,这是因为我用它来处理TB的数据 数据输入只是简单地输入到迭代器中,我有一个类,它封装了一个run函数,从迭代器中提取一行,进行一些分析,然后将分析写入一个文件。线程必须彼此共享的唯一信息是它们要写入的对象的名称。简单对吧?我只希望每个线程同时执行run函数,这样我们就可以快速迭代输入数据。在python中,它将是简单的 from multiprocessing imp

首先我想说的是,我正在从python向更复杂的代码迈进。我现在开始学习Java,而且我是个新手。我知道Java非常擅长多线程处理,这是因为我用它来处理TB的数据

数据输入只是简单地输入到迭代器中,我有一个类,它封装了一个run函数,从迭代器中提取一行,进行一些分析,然后将分析写入一个文件。线程必须彼此共享的唯一信息是它们要写入的对象的名称。简单对吧?我只希望每个线程同时执行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多线程的东西,但它是用来在网络上聊天、共享数据等的。这是不是像我想的那样简单?如果有人能给我指出正确的方向,我会很乐意做腿部的工作

谢谢,ExecutorService(ThreadPoolExecutor)将是Java等价物

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))
}
resultQueue用于收集作业的结果

有关详细信息,请参阅。

您也可以使用。
class MyJob implements Runnable {
    /* collect useful parameters in the constructor */
    public MyJob(...) {
        /* omitted */
    }

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