import java.util.concurrent.Semaphore;
public class Solution {
final static float INF = Float.POSITIVE_INFINITY;
static Semaphore[][] semaphores;
public static Thread[] AOEThreads(float[][] matrix) {
semaphores = new Semaphore[matrix.length][matrix.length];
int v = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] != 0 && matrix[i][j] != INF) {
v++;
semaphores[i][j] = new Semaphore(0);
}
}
}
Thread[] threads = new Thread[v];
int index = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (semaphores[i][j] != null) {
int x = i;
int y = j;
float f = matrix[x][y];
threads[index++] = new Thread(() -> {
try {
for (int k = 0; k < semaphores.length; k++) {
if (semaphores[k][x] != null) {
semaphores[k][x].acquire();
}
}
System.out.println(Thread.currentThread().getName() + "开始执行");
Thread.sleep((int) f * 1000);
System.out.println(Thread.currentThread().getName() + "执行了" + f + "妙后执行完毕");
for (int k = 0; k < semaphores.length; k++) {
if (semaphores[y][k] != null) {
semaphores[x][y].release();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}, "vertex[" + x + "][" + y + "]");
}
}
}
return threads;
}
public static void main(String[] args) {
float[][] matrix = new float[][]{
{0, 3, 2, INF, INF, INF},
{INF, 0, INF, 2, 3, INF},
{INF, INF, 0, 4, INF, 3},
{INF, INF, INF, 0, INF, 2},
{INF, INF, INF, INF, 0, 1},
{INF, INF, INF, INF, INF, 0}
};
Thread[] threads = AOEThreads(matrix);
for (Thread thread : threads) {
thread.start();
}
}
}