Java: CyclicBarrier не работает
Софт должен сделать несколько исчислений: всего 62500 циклов, а продолжительность одного цикла - 0,5 секунды. Это будет ~ 8 часов работы (в течение в течение). Я должен разделить на 100 отдельных потоков, и рабочее время будет сокращено до 8 минут работы. Я не могу открыть 62500 потоков, потому что ЦП, я должен найти решение, чтобы открыть только 100 потоков, чем снова 100. Я пытался с CountDownLatch, но я не могу сбросить цикл, поэтому мое решение будет CyclicBarrier.
private CycleBarrier cb;
// this Overrided run is called only once from the view to not block the UI.
@Override
public void run(){
// count is the number of the actions that i want to do
// this is why I'm using CycleBarrier
for(int count = 0; count < 2; count++){
System.out.println("MAIN THREAD: #"+count);
int x1 = 0;
cb = new CycleBarrier(100, new Runnable(){
@Override
public void run(){
// HOW TO STOP CYCLE ???
}
});
for(int i = 0; i < 100; i++){
new Thread(new Test(x1, cb)).start();
x1 += 25;
}
}
}
И тестовый класс
public class Test implements Runnable{
int x1;
CycleBarrier cb;
public Test(int _x1, CycleBarrier _cb){
x1 = _x1;
cb = _cb;
}
@Override
public void run(){
// this for in for has 6250 loops
for(int i = x1; < x1+25; i++){
for(int j = 0; j < 250; j++){
System.out.println(" |--> LOOK I'm WORKING: "+i+" "+j);
}
}
// After the job is done, it should be put in to await
cb.await();
}
}
Цикл не работает. Он открывает 200 сразу. Я пытался отладить (затмение), но я не знаю, почему, нить перепрыгивает с одного на другой, я не могу следить за результатом.
Консоль должна выглядеть так:
MAIN THREAD: #0
LOOK I'm WORKING: 0 0
LOOK I'm WORKING: 0 1
...
LOOK I'm WORKING: 25 254
LOOK I'm WORKING: 25 255
MAIN THREAD: #1
LOOK I'm WORKING: 0 0
LOOK I'm WORKING: 0 1
...
LOOK I'm WORKING: 25 254
LOOK I'm WORKING: 25 255
1 ответ
cb = new CycleBarrier(100, new Runnable(){
@Override
public void run(){
// HOW TO STOP CYCLE ???
}
});
for(int i = 0; i < 100; i++){
new Thread(new Test(x1, cb)).start();
x1 += 25;
}
В своем коде вы открываете новый объект Thread внутри нового Runnable. Итак, есть две темы.