Piszę kod, który spawnuje dwa wątki, a następnie czeka na ich synchronizację przy użyciu klasy CyclicBarrier. Problem polega na tym, że cykliczna bariera nie działa zgodnie z oczekiwaniami, a główny wątek nie czeka na zakończenie poszczególnych wątków. Oto, jak wygląda mój kod:Jak uzyskać java.concurrency.CyclicBarrier do pracy zgodnie z oczekiwaniami
class mythread extends Thread{
CyclicBarrier barrier;
public mythread(CyclicBarrier barrier) {
this.barrier = barrier;
}
public void run(){
barrier.await();
}
}
class MainClass{
public void spawnAndWait(){
CyclicBarrier barrier = new CyclicBarrier(2);
mythread thread1 = new mythread(barrier).start();
mythread thread2 = new mythread(barrier).start();
System.out.println("Should wait till both threads finish executing before printing this");
}
}
Każdy pomysł, co robię źle? Czy istnieje lepszy sposób na zapisanie tych metod synchronizacji barier? Proszę pomóż.
Jednak ten sprawia, że jest synchroniczny, podczas gdy OP wydaje się chcieć prawdziwie asynchronicznego podejścia. –
@Chandru: Cóż, albo "Należy poczekać, aż oba wątki zakończą wykonywanie przed wydrukowaniem tego" lub asynchronicznie. Nie możesz czekać asynchronicznie. –
Jeśli rozumiem to poprawnie, to, czego potrzebuje, to wydrukowanie tej linii po ukończeniu 2 wątków, co można osiągnąć, robiąc to w akcji bariery. W ten sposób, jeśli w bieżącym wątku są inne operacje, które nie zależą od zakończenia pozostałych 2 wątków, mogą one kontynuować. BTW Nie byłem tym, który głosował na ciebie. Jest to nadal poprawne rozwiązanie, jeśli wszystkie inne operacje w bieżącym wątku zależą od ukończenia 2 wątków. –