4 |
import java.util.ArrayList; |
import java.util.ArrayList; |
5 |
import java.util.Map; |
import java.util.Map; |
6 |
import java.util.Queue; |
import java.util.Queue; |
|
import java.util.concurrent.BrokenBarrierException; |
|
7 |
import java.util.concurrent.CyclicBarrier; |
import java.util.concurrent.CyclicBarrier; |
8 |
import java.util.concurrent.atomic.AtomicInteger; |
import java.util.concurrent.atomic.AtomicInteger; |
9 |
import java.util.logging.Level; |
import java.util.logging.Level; |
73 |
|
|
74 |
ServiceConfig conf = ServiceConfig.getInstance(); |
ServiceConfig conf = ServiceConfig.getInstance(); |
75 |
|
|
76 |
try { |
try (BarrierMarker marker = new BarrierMarker() ) { |
77 |
while ( ! ikkeDaekkede.isEmpty() ) { |
while ( ! ikkeDaekkede.isEmpty() ) { |
78 |
|
|
79 |
if (task.isAborted()) { |
if (task.isAborted()) { |
80 |
System.out.println( "Worker/" + workerID + " aborting"); |
System.out.println( "Worker/" + workerID + " aborting"); |
81 |
return; |
break; |
82 |
} |
} |
83 |
|
|
84 |
|
|
154 |
} |
} |
155 |
|
|
156 |
|
|
157 |
|
|
|
try { |
|
|
logger.info( "Worker/" + workerID + " afventer barrier"); |
|
|
barrier.await(); |
|
|
} catch (Exception e) { |
|
|
logger.log(Level.SEVERE, e.getMessage(), e); |
|
|
} |
|
158 |
|
|
159 |
System.out.println( "Worker/" + workerID + " stopping"); |
System.out.println( "Worker/" + workerID + " stopping"); |
160 |
} |
} |
161 |
|
|
162 |
|
|
163 |
|
/** |
164 |
|
* Makes sure the barrier is touched correctly no matter how the the current code block is exited. |
165 |
|
* @author thn |
166 |
|
* |
167 |
|
*/ |
168 |
|
public class BarrierMarker implements AutoCloseable { |
169 |
|
@Override |
170 |
|
public void close() { |
171 |
|
try { |
172 |
|
logger.info( "Worker/" + workerID + " afventer barrier"); |
173 |
|
barrier.await(); |
174 |
|
} catch (Exception e) { |
175 |
|
logger.log(Level.SEVERE, e.getMessage(), e); |
176 |
|
} |
177 |
|
} |
178 |
|
} |
179 |
|
|
180 |
} |
} |