2012-12-07 32 views
1

首先我想說我正在從python工作到更復雜的代碼。我現在正在使用Java,而且我非常新。我知道Java非常擅長多線程,這很好,因爲我正在使用它來處理數TB的數據。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中,我有我的10000行的分析代碼,並可以很容易通過我的輸入迭代通過它我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多線程的東西,但其通過網絡交流,共享數據等。這是簡單的,因爲我認爲它是?如果有人能夠指引我走向正確的方向,我會很樂意做這項工作。

感謝

回答

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

+1

您也可以使用[Executors工廠(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html)。 – assylias

+0

@assylias我們走了,我正在找那個,謝謝! – udoprog