Я написал метод, который следует повторять 1000 раз, и метод снова представляет собой еще один цикл (например, вложенный цикл). Поскольку время выполнения не было разумным, я решил написать поток, чтобы запустить его быстрее. Вот метод:thread skips some iterations
public class NewClass implements Runnable {
@Override
public void run() {
for (int j = 0; j < 50; j++) {
System.out.println(i+","+j);
/*
*
* my method
*/
}
}
}
и вот как основной класс называет его:
for (int i = 0; i < 1000; i++) {
NewClass myMethod = new NewClass();
Thread thread = new Thread(myMethod);
thread.start();
}
проблема заключается в том, что, когда я запускаю его, поток пропускает первую итерацию (когда я = 0) в основном классе, а затем в следующих итерациях он пропускает некоторые итерации внутреннего цикла (myMethod). Вот результат Println:
1,0
1,1
2,0
2,1
3,0
3,1
3,2
...
3,22
4,0
...
ясно, что скачет я = 0 и для других итераций он не может закончить. Я уверен, что проблема не в теле метода. Я запускаю его несколько раз без потока. Это первый раз, когда я пишу поток, и я думаю, что проблема в потоке.
Я не думаю, что этот код делает то, что вы думаете, что делает ... если вы хотите разделить работу между потоками, вам нужно разделить ее и дать конкретную рабочую нагрузку для каждого потока. Это чередование и в значительной степени гарантировано, что потоки будут мешать друг другу. Кроме того, используйте рамки параллелизма. Java 5 представила это десять лет назад. –
i начинается с 1, как это пропустить i = 0 – JRowan
@JRowan: Вы правы. Это была моя ошибка. Я починил это. – MTT