CyclicBarrier consente designa una filettatura per ordine:
Designazione di un filo che restituisce in un ordine specifico è possibile se, come dici, si racchiude la logica completamento barriera in una condizione che è specifico per un thread indice. Pertanto, la tua implementazione sopra funzionerà in base alla documentazione che hai citato.
Tuttavia, il punto di confusione qui - è che la documentazione parla dell'identità di thread in termini di ordine di ritorno alla barriera, piuttosto che l'identità dell'oggetto di thread. Pertanto, il thread 0 si riferisce alla stringa 0th da completare.
Alternativa: designazione di una filettatura utilizzando altri meccanismi.
Se si desidera che una determinata discussione esegua un'azione specifica dopo che altri lavori sono stati completati, è possibile utilizzare un meccanismo diverso, ad esempio un semaforo. Se hai desiderato questo comportamento, potresti non aver davvero bisogno della barriera ciclica.
Per verificare cosa si intende per documentazione, eseguire la classe (modificata da http://programmingexamples.wikidot.com/cyclicbarrier) in basso, dove è stato incorporato lo snippet.
Esempio di ciò che si intende con la documentazione per il CyclicBarrier
filo pacchetto; importazione java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample
{
private static int matrix[][] =
{
{ 1 },
{ 2, 2 },
{ 3, 3, 3 },
{ 4, 4, 4, 4 },
{ 5, 5, 5, 5, 5 } };
static final int rows = matrix.length;
private static int results[]=new int[rows];
static int threadId=0;
private static class Summer extends Thread
{
int row;
CyclicBarrier barrier;
Summer(CyclicBarrier barrier, int row)
{
this.barrier = barrier;
this.row = row;
}
public void run()
{
int columns = matrix[row].length;
int sum = 0;
for (int i = 0; i < columns; i++)
{
sum += matrix[row][i];
}
results[row] = sum;
System.out.println("Results for row " + row + " are : " + sum);
// wait for the others
// Try commenting the below block, and watch what happens.
try
{
int w = barrier.await();
if(w==0)
{
System.out.println("merging now !");
int fullSum = 0;
for (int i = 0; i < rows; i++)
{
fullSum += results[i];
}
System.out.println("Results are: " + fullSum);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String args[])
{
/*
* public CyclicBarrier(int parties,Runnable barrierAction)
* Creates a new CyclicBarrier that will trip when the given number
* of parties (threads) are waiting upon it, and which will execute
* the merger task when the barrier is tripped, performed
* by the last thread entering the barrier.
*/
CyclicBarrier barrier = new CyclicBarrier(rows);
for (int i = 0; i < rows; i++)
{
System.out.println("Creating summer " + i);
new Summer(barrier, i).start();
}
System.out.println("Waiting...");
}
}
Direi che il thread specificato come thread "action" elaborerà il codice extra subito dopo aver eseguito tutti i thread e inizieranno l'esecuzione dopo 'barrier.await()'. Questo è abbastanza pericoloso perché devi assicurarti che gli altri thread (attualmente in esecuzione) non tocchino i dati manipolati dal codice di "azione". – toto2