【发布时间】:2014-05-11 07:37:10
【问题描述】:
我有一个 CyclicBarrier,当有“x”个参与方(线程)等待它时,它会跳闸。在这些“x”线程中,“y”的生命周期非常短,并且在成功完成执行后会很快终止。现在,屏障一直在等待并超时,因为它一直在等待“x”线程。我该如何解决这个问题?
CyclicBarrier barrier = new CyclicBarrier(NUM_THREADS, new UpdateState());
private class UpdateState implements Runnable {
@Override
public void run() {
for (int i = 0; i < NUM_THREADS; ++i) {
if (availability[i]) {
// Update condition for "i'th" thread to run
break;
}
}
}
}
public long write() throws IOException {
waitForTurn();
}
private void waitForTurn() {
while (!canSchedule()) {
try {
barrier.await();
} catch (InterruptedException e) {
// Assert fail
} catch (BrokenBarrierException e) {
// Assert fail
}
}
}
private boolean canSchedule() {
return // some state checks;
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 0; i < NUM_THREADS; ++i) {
Future<Long> responseFuture = executorService.submit(new Task(...));
responses.add(responseFuture);
}
executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.SECONDS);
// Check futures
}
现在说 task1,调用 write() 5 次,task2 调用 write 500 次..然后 task1 将在遇到障碍 5 次后终止,但 task2 将继续运行。
【问题讨论】:
-
“旅行”是什么意思?另外,能否给出相关代码?
-
y线程如何在不触发屏障的情况下成功终止? -
屏障被触发,请看示例代码。
标签: java multithreading concurrency barrier cyclicbarrier