2012-11-12 53 views
1

我對Java Threads相當新,我通常使用C來進行並行化。並行算法具有相同的模式,因爲它遵循的一個:java中的OpenMP任務

void traverse(node* p) 
{ 
    if (p->left) 
     #pragma omp task // p is firstprivate by default 
     traverse(p->left); 
    if (p->right) 
     #pragma omp task // p is firstprivate by default 
     traverse(p->right); 
} 

我會使用的openMP任務指令,例如。

任務描述

當線程遇到任務構造,從 產生的任務相關聯的結構化塊的代碼。遇到的線程 可能會立即執行任務,或推遲執行。在後一種情況下,團隊中的任何線程都可以分配任務。 完成該任務可以使用任務同步 結構來保證。任務構造可嵌套在外部任務內,但內部任務的任務區域不是外部任務的任務區域的一部分。

我的問題是:

我怎麼能實現與Java Threads此相同的想法(任務)?

+0

萬一你在這件事情好奇,EPCC曾經有過一個研究項目,稱爲[JOMP](http://www2.epcc.ed.ac.uk/computing/research_activities/jomp/index_1的.html)。 JOMP將Java代碼與類似OpenMP的指令(特殊格式的註釋)轉換爲調用到運行時庫中的純Java代碼,後者又使用Java線程。不幸的是,該項目似乎被放棄了(可能是因爲EPCC從Sun切換到Cray),它不支持任務(他們在2008年與OpenMP 3.0一起提供)。 –

+0

@HristoIliev謝謝。雖然,我已經解決了這個問題,但總是歡迎知識。我會看看。 – dreamcrash

回答

1

OpenMP的編譯指令確實使並行更容易一些。

在Java中,您首先需要創建一個實現Runnable的類。
- 例如:公共類遍歷實現Runnable

,那麼你只neew創建類,並呼籲「跑」來啓動線程。

private void traverse(node p) 
{ 
    Traverse t = null; 

    if (p.left) 
     t = new Traverse(p.left); 
    if (p->right) 
     t = new Traverse(p.right) 

    t.run(); // start thread. this call will not wait for run to finishes 
} 
+0

感謝您的重播,但是對於每一個Traverse而言,這讓你走了,創建了一個新線程? – dreamcrash

+0

在示例代碼中,是的,它會每次創建一個新線程。 Java確實提供了幾個線程池 - 比如Executors.newFixedThreadPool(numberOfThreads)。如果你知道你不會創建很多Traveerse線程,並且它們短暫存在,那麼你可以在不使用線程池的情況下獲得。 – BradRees

+0

那麼對於Executors,我可以保存任務在後面執行? – dreamcrash