输入:
一个无环有向图的对接矩阵。假设该矩阵尺寸为n × n
输出:
一个长度为n的Thread数组。保证这n个线程的run方法内部都会通过Thread.currentThread().getName()
互斥地输出一遍自己的线程名。并且输出的顺序要满足有向图中的前驱关系。run方法中的其它代码可以任意顺序执行。
假设这个算法的名称是func(),表示有向图的对接矩阵是matrix,那么main函数中的内容是:
public static Thread[] func(boolean[][] matrix) {
/* code*/
}
public static void main(String[] args) {
boolean[][] matrix = new matrix[][]{
/* matrix */
}
Thread[] threads = func(matrix);
for (Thread thread : threads) {
thread.start();
}
}
样例:
输入样例1:
(
0
1
0
0
0
1
0
0
0
)
\left( \begin{matrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{matrix} \right)
⎝⎛000100010⎠⎞
输出样例1:
Thread-0
Thread-1
Thread-2
输入样例2:
(
0
0
1
1
1
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
)
\left( \begin{matrix} 0 & 0 & 1 & 1 & 1 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{matrix} \right)
⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛0000000000000011000001000000100000000001000000110⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
输出样例2:
Thread-0
Thread-4
Thread-1
Thread-3
Thread-2
Thread-5
Thread-6
Thread-1
Thread-0
Thread-2
Thread-4
Thread-5
Thread-6
Thread-3
由于多线程的异步性,main函数的输出结果可以有多种,但是必须满足有向图所表示的前驱关系,这就得保证返回的Thread的数组只能有一种输出结果了。
如果在检验算法结果的时候发现像输入样例2这样明明可以又输出运行结果的输入样例多次运行后只有一种输出结果,那说明肯定是把多线程算法当成单线程算法来做了,不给予通过。
代码实现:
import java.util.concurrent.Semaphore;
public class Solution {
static Semaphore[][] semaphores;
public static Thread[] func(boolean[][] matrix) {
semaphores = new Semaphore[matrix.length][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j]) semaphores[i][j] = new Semaphore(0);
}
}
Thread[] threads = new Thread[matrix.length];
for (int i = 0; i < threads.length; i++) {
int j = i;
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
try {
for (int k = 0; k < semaphores.length; k++) {
if (semaphores[k][j] != null) semaphores[k][j].acquire();
}
System.out.println(Thread.currentThread().getName());
for (int k = 0; k < semaphores.length; k++) {
if (semaphores[j][k] != null) semaphores[j][k].release();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
return threads;
}
public static void main(String[] args) {
boolean[][] matrix = new boolean[][]{
{false, false, true, true, true, false, false},
{false, false, true, false, false, false, false},
{false, false, false, false, false, false, false},
{false, false, false, false, false, false, false},
{false, false, false, false, false, true, true},
{false, false, false, false, false, false, true},
{false, false, false, false, false, false, false},
};
Thread[] threads = func(matrix);
for (Thread thread : threads) {
thread.start();
}
}
}
运行结果: