2015-06-01 5 views
0

У меня есть цикл, например for (int i=1;i<=10;i++), и я хочу создать в нем 10 потоков, каждый из которых выполнит одну и ту же задачу по набору данных и вернет результат. Затем обработайте этот результат внутри цикла. Любые идеи, как это можно сделать?Многострочные потоки в Java

for (int i=1;i<=10;i++) { 
    Work w = new Work(); 
    Thread t = new Thread(w); 
    w.getResultFromThread(); 
    //process w 
} 

class Work implements Runnable { 
    public void run() { 
     //perform tasks 
    } 

    public int getResultFromThread() { 
      return result; 
    } 
} 

Я хочу, чтобы каждый поток работал параллельно, но когда я получаю результат один за другим.

+6

Читайте об исполнителях; это именно то, что вы хотите здесь. – chrylis

+1

Нить не вернет ничего, но Исполнитель может вернуть что-то обратно в вызывающий поток. Поэтому используйте исполнителя. 1) http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html 2) http://www.javaworld.com/article/2078809/java-concurrency/java -101-the-next-generation-java-concurrency-without-the-pain-part-1.html – K139

+1

Похоже, что здесь происходит фундаментальное непонимание параллели. Как вы можете * не * обрабатывать результаты один за другим, когда обработка выполняется во время цикла? –

ответ

2

Если вы не хотите использовать исполнителей, то вы можете сделать это следующим образом:

int size = 10; 
Thread[] threads = new Thread[size]; 
Work[] works = new Work[size]; 
for (int i = 1; i <= size; i++) { 

    Work w = new Work(); 
    works[i - 1] = w; 
    Thread t = new Thread(w); 
    threads[i - 1] = t; 

    // Start the thread 
    t.start(); 
} 
// now you have started all the threads 


for (int i = 0; i < size; i++) { 

    // wait for each thread to complete execution, before extracting the result 
    // [here i am assuming that getResultFromThread() does not block 
    // till we get the result, if it blocks, then no need to join] 
    threads[i].join(); 

    int result = works[i].getResultFromThread(); 
    // do something with the result 
} 
+0

Почему я получаю эту ошибку в строке 'int result = threads [i] .getResultFromThread()' 'метод getResultFromThread не определен для типа Thread' – GeR

+0

Извините, что ответ исправлен. Причина этой ошибки: поток является контейнером для runnable, а поток не имеет метода getResultFromThread, этот метод присутствует в объекте Work. – MJSG

+0

Idiomatic Java должен иметь цикл for for for (int i = 0; i user949300

1
ArrayList<Work> listOfJobs = new ArrayList<Work>(); 
ArrayList<Thread> threadList = new ArrayList<Thread>(); 
for(int i = 0 ; i < 10; i++) { 
    Work w = new Work(); 
    listOfJobs.add(w); 
    Thread t = new Thread(w); 
    threadList.add(t); 
    t.start(); 
} 

for(Thread t : listOfJobs) { 
    t.join(); 
    w.getResultsFromThread(); 
} 

Таким образом, вы не нужны исполнители по какой-либо причине вы, возможно, не использовать их.

Сначала вы создаете все потоки и запускаете их (1-й цикл), затем вы вызываете на них join, чтобы убедиться, что поток, из которого вы хотите получить результаты, будет выполнен (2-й цикл).

Вы можете всегда передавать listOfJobs другим способом обработки результатов.

+0

Я не думаю, что 'w.join()' будет работать (ха-ха), поскольку 'Work' реализует' Runnable', а не 'Thread'. – user949300

+0

@ пользователь949300 yep, спасибо, что указал этот. Есть что-то в написании кода прямо в ответ, что делает меня бессознательным. – zubergu

Смежные вопросы