CyclicBarrier permite la designación de un hilo por orden:
La designación de un hilo que vuelve a un fin específico es posible si, como usted dice, se encierra la lógica conclusión de barrera en una condicional que es específico de un hilo índice. Por lo tanto, su implementación anterior funcionará de acuerdo con la documentación que citó.
Sin embargo, el punto de confusión aquí es que la documentación está hablando de identidad de subprocesos en términos de orden de retorno a la barrera, en lugar de identidad de objeto de subprocesos. Por lo tanto, el hilo 0 se refiere al 0º hilo para completar.
Alternativa: designación de un subproceso con otros mecanismos.
Si desea tener un hilo específico en una acción específica después de que se completen otros trabajos, puede usar un mecanismo diferente, como un semáforo, por ejemplo. Si desea este comportamiento, puede que realmente no necesite la barrera cíclica.
Para inspeccionar qué significa la documentación, ejecute la clase (modificada desde http://programmingexamples.wikidot.com/cyclicbarrier) a continuación, donde he incorporado su fragmento.
Ejemplo de lo que se entiende por la documentación para el CyclicBarrier
hilo paquete; import 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...");
}
}
Supongo que el hilo que especifique como hilo de "acción" procesará el código adicional justo después de que todos los hilos hayan terminado y comenzarán a ejecutarse después de 'barrier.await()'. Eso es bastante peligroso porque debe asegurarse de que los otros hilos (que se están ejecutando) no toquen los datos manipulados por el código de "acción". – toto2