CyclicBarrier позволяет назначать поток с помощью ORDER:
Назначение потока, который возвращается в заданном порядке, возможно, если, как вы говорите, вы заключаете логику завершения барьера в условное условие, котороеявляется специфичным для индекса потока.Таким образом, ваша реализация выше будет работать в соответствии с документацией, которую вы цитировали.
Однако здесь возникает путаница - в документации говорится об идентичности потока с точки зрения порядка возврата к барьеру, а не идентичности объекта потока.Таким образом, поток 0 ссылается на 0-й поток для завершения.
Альтернатива: назначение потока с использованием других механизмов.
Если вы хотите, чтобы определенный поток выполнял определенное действие после завершения других работ, вы можете использовать другоймеханизм - как семафор, например.Если вам нужно такое поведение, вам может не понадобиться циклический барьер.
Чтобы проверить, что подразумевается под документацией, запустите класс (изменен с http://programmingexamples.wikidot.com/cyclicbarrier) ниже, где я включил ваш фрагмент.
Пример того, что подразумевается поддокументы для потока пакета CyclicBarrier
; импорт java.util.concurrent.BrokenBarrierException; импорт 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...");
}
}